一個簡單的Flask Web伺服器
1. 初始化
Flask程式必須建立一個程式例項。
Web伺服器把接收到的所有客戶端請求,轉交給Web伺服器閘道器介面物件處理。
一般套路是這樣的:
from flask import Flask
app = Flask(__name__)
這裡建立Flask app例項(Flask的建構函式),需要提供的引數只有一個,就是程式主模組或包的名字,一般就是Python的name變數。
2. 路由和檢視函式
客戶端的請求經由Web伺服器轉發給Flask程式例項。程式例項需要URL到具體程式碼的對映關係。這個對映關係稱為路由。
Flask中最簡單的路由定義方式是app.route修飾器。
@app.route('/')
def index():
# 這裡是demo,實際這麼返回響應字串是不規範的
return '<h1>Hello World!</h1>'
這裡所謂的修飾器,是Python語言的特性,可以規定函式的不同行為,比如類中的靜態方法就需要增加修飾器 @staticmethod。
上面的路由定義,把根路徑和index函式關聯起來,如果部署程式的伺服器域名是 www.example.com,那麼瀏覽器中輸入 http://www.example.com,就會觸發這個函式。
函式的返回值稱為響應,是客戶端接收到的內容。這樣如果客戶端是Web瀏覽器,響應就是給客戶看的文件。
index()這樣的函式,叫做檢視函式(view function),返回的響應可以包含HTML的簡單字串,也可以是複雜的表單。
檢視函式的引數
URL是可以含有可變部分的,比如 http://www.example.com/user/,那麼這個可變的部分是可以作為檢視函式的引數的:
@app.route('/user/<name>')
def user(name):
return '<h1>Hello, %s!</h1>' % name
動態部分預設是字串,也可以指定特別的型別。比如 會匹配id是整數的URL。類似的還 float 和 path
。path和字串的區別是,path不會被斜線分隔。
3. 啟動伺服器
用 run 方法啟動Flask整合的Web伺服器:
if __name__ == '__main__':
app.run(debug=True)
Flask提供的Web伺服器並不適合生產環境,生產環境的Web伺服器會有專門的章節介紹。
4. 設定Web伺服器IP
我的工作環境是雲主機,不能在linux主機上啟動瀏覽器。那麼需要修改app.run的引數,讓我能夠從桌面瀏覽器訪問雲主機的web伺服器。
hello.py:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello World!</h1>'
if __name__ == '__main__':
app.run(host="10.xxx.xxx.184", port=80, debug=True)
執行py指令碼:
[[email protected] src]$ python hello.py
* Running on http://10.xxx.xxx.184:80/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 769-409-611
就可以通過桌面電腦的瀏覽器,從 http://10.xxx.xxx.184:80/ 訪問網頁
5 請求-響應
5.1 上下文
Flask收到客戶端請求以後,會把請求發給檢視函式。
檢視函式如何得知請求的一些資訊呢,可以通過請求上下文,可以像變數一樣使用上下文物件。
變數名 | 說明 |
---|---|
request | 請求物件,客戶端發來的HTTP請求 |
session | 使用者會話,請求之間需要記錄的值的詞典 |
舉個例子:
from flask import request
@app.route('/')
def index():
user_agent = request.headers.get('User-Agent')
return '<p>Your browser is %s</p>' % user_agent
request這樣的上下文變數,是執行緒全域性的,不同的執行緒,具有不同的request
5.2 狀態碼
檢視函式返回的是一個HTML字串,除了這個字串,HTTP還需要一個狀態碼。
Flask預設的HTTP狀態碼是200。
如果需要返回其他的狀態碼,通過return的第二個返回值設定:
@app.route('/')
def index():
return '<h1>Bad Request</h1>', 400
檢視flask的log可以看到結果:
* Running on http://10.xxx.xxx.184:80/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 769-409-611
10.xxx.xxx.79 - - [11/Jan/2018 15:39:08] "GET / HTTP/1.1" 400 -
5.3 重定向
通過redirect()函式,可以實現重定向:
from flask import redirect
@app.route('/')
def index():
return redirect('http://www.baidu.com')
再次反問這個頁面,會重定向到百度了,狀態碼是302:
10.xxx.xxx.79 - - [11/Jan/2018 15:44:53] "GET / HTTP/1.1" 302 -