Flask 程序的基本結構

一、初始化

  全部Flask程序都必須建立一個程序實例。web服務器使用一種名爲Web服務器網關藉口的協議,把接收自客戶端的全部請求都轉交給這個對象處理。python

from flask import Flask
app = Flask(__name__)

  Flask類的構造函數只有一個必須指定的參數,即程序主模塊或包的名字。web

二、路由和視圖函數

客戶端把請求發送給Web服務器,Web服務器再把請求發送給Flask程序實例。程序實例須要知道對每一個URL請求運行哪些代碼,因此保存了一個URL到Python函數的映射關係。處理URL和函數之間關係的程序稱爲路由。數據庫

@app.route('/')
def index():
    return '<h1>Hello Flask!</h1>'

像index()這樣的函數稱爲視圖函數。視圖函數返回的響應能夠包含HTML的簡單字符串,也能夠是複雜的表單。flask

@app.route('/user/name')
def index(name):
    return '<h1>Hello %s!</h1>' % name

尖括號內的內容就是動態內容,任何能匹配靜態部分的URL都會映射到這個路由上。服務器

路由中的動態部分默認使用字符串,不過也可使用類型定義。例如,/usr/<int:id>只會匹配動態片斷爲整數的URL。Flask支持在路由中使用int、float和path類型。cookie

三、啓動服務器

if __name__ == '__main__':
    app.run(debug=True)

有一些選項參數可被app.run()函數接受用於設置web服務器的操做模式。在開發過程當中啓用調試模式會帶來一些便利,好比激活調試器和重載程序。要想啓用調試模式,咱們能夠把debug參數設爲True。session

四、一個完整的程序

#!/usr/bin/env python

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>Hello Flask!</h1>'

if __name__ == '__main__':
    app.run(debug=True)

包含動態路由的Flask程序多線程

#!/usr/bin/env python

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>Hello Flask!</h1>'

@app.route('/user/<name>')
def user(name):
    return '<h1>Hello,%s!</h1>' % name

if __name__ == '__main__':
    app.run(debug=True)

http://127.0.0.1:5000/user/cairuiapp

五、請求--響應循環

下面介紹這個框架的一些設計理念。框架

①程序和請求上下文

爲了不大量無關緊要的參數把視圖函數弄得一團糟,Flask請求使用上下文臨時把某些對象變爲全局可訪問。

from flask import request

@app.route('/')
def index():
    user_agent = request.headers.get('User-Agent')
    return '<p>Your browser is %s</p>' % user_agent

Flask使用上下文讓特定的變量在一個線程中全局可訪問,與此同時卻不會干擾其餘線程。

線程是可單獨管理的最小指令集。進程常常使用多個活動線程,有時還會共享內存或文件句柄等資源。多線程web服務器會建立一個線程池,再從線程池中選擇一個線程用於處理接收到的請求。

(表)Flask上下文全局變量

變量名 上下文 說  明
current_app 程序上下文 當前激活程序的程序實例
g 程序上下文 當前請求時用做臨時存儲對象。每次請求都會重設這個變量
request 請求上下文 請求對象,封裝了客戶端發出的HTTP請求中的內容
session 請求上下文 用戶會話,用於存儲請求之間須要「記住」的值得詞典

Flask在分發請求以前激活(或推送)程序和請求上下文,請求處理完成後再將其刪除。

from hello import app
from flask import current_app
current_app.name

=========================================
Traceback (most recent call last)
from hello import app
from flask import current_app
app_ctx = app.app_context()
app_ctx.push()
current_app.name

②請求調度

from hello import app
app.url_map

③請求鉤子

有時在處理請求以前或以後執行代碼會頗有用。例如,在請求開始時,咱們可能須要建立數據庫鏈接或者認證發起請求的用戶。爲了不在每一個視圖函數中都使用重複的代碼,Flask提供了註冊通用函數的功能,註冊函數可在請求被分發到視圖函數以前或以後調用。

Flask支持如下4種鉤子:

    • before_first_request  註冊一個函數,在處理第一個請求以前運行。
      • before_request  註冊一個函數,在每次請求以前運行
        • after_request  註冊一個函數,若是沒有未處理的異常拋出,在每次請求以後運行
          • teardown_request  註冊一個函數,即便有未處理的異常拋出,也在每次請求以後運行。

④響應

@app.route('/')
def index():
    return '<h1>Bad Request</h1>', 400
from flask import make_response
@app.route('/')
def index():
    response = make_response('<h1>This carries a cookie!</h1>')
    response.set_cookie('answer','42')
    return response

六、Flask擴展

使用Flask-Script支持命令行選項

#!/usr/bin/env python

from flask_script import Manager


from flask import Flask
app = Flask(__name__)
manager = Manager(app)
@app.route('/')
def index():
    return '<h1>Hello Flask!</h1>'

@app.route('/user/<name>')
def user(name):
    return '<h1>Hello,%s!</h1>' % name

if __name__ == '__main__':
    manager.run()
相關文章
相關標籤/搜索