1. 程式人生 > >一個簡單的Flask Web伺服器

一個簡單的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。類似的還 floatpath

。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/ 訪問網頁

image

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

image

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 -