1. 程式人生 > >【Flask】Flask學習筆記(一) 應用基本結構

【Flask】Flask學習筆記(一) 應用基本結構

route windows 數字 browser 基本結構 主程序 web瀏覽器 ive app

初始化

使用前必須創建一個應用實例

from flask import Flask
app = Flask(__name__)

  

路由和視圖函數

請求流程

客戶端(web瀏覽器)--> web服務器 --> Flask應用實例

路由概念

應用實例需要知道對每個 URL 的請求要運行哪些代碼, 所以保存了一個 URL 到 Python 函數的映射關系。處理 URL 和函數之間關系的程序稱為路由。

定義路由

使用app.route 裝飾器

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


視圖函數

上面類似於index這種處理入站請求的函數稱為視圖函數。

響應

視圖函數返回值稱為響應。響應可以為簡單字符串,也可以是復雜表單。

實例:一個完整的應用

hello.py

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

  


windows運行

E:\study\flask>set FLASK_APP=hello.py
E:\study\flask>flask run
 * Serving Flask app "hello.py"
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [27/Mar/2019 15:53:11] "GET / HTTP/1.1" 200 -

  


瀏覽器顯示

技術分享圖片

通過編程方式啟動

主程序尾部增加如下代碼

if __name__==‘__main__‘:
    app.run()

  

動態路由

URL中包含可變部分

dynamic_route.py

from flask import Flask
app = Flask(__name__)

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

@app.route(‘/user/<name>‘)
def user(name):
    return ‘<h1>Hello, {}!</h1>‘.format(name)

if __name__==‘__main__‘:
    app.run()

  


瀏覽器顯示

技術分享圖片

調試模式

調試模式中會自動加載兩個工具: 重載器 和調試器 。

啟用調試模式

執行flask run之前設定FLASK_DEBUG=1

E:\study\flask>set FLASK_APP=hello.py
E:\study\flask>set FLASK_DEBUG=1
E:\study\flask>flask run
 * Serving Flask app "hello.py" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 627-210-384
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

  

編程代碼中設置

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

  

應用&請求上下文

上下文作用:臨時把某些對象變為全局可訪問。

from flask import request

@app.route(‘/‘)
def index():
    user_agent = request.headers.get(‘User-Agent‘)
    return ‘<p>Your browser is {}</p>‘.format(user_agent)

  

index視圖函數中把 request 當作全局變量使用

Flask上下文全局變量

技術分享圖片

上下文處理流程

激活應用&請求上下文 --> ask 分派請求 --> 請求處理完成再將其刪除

激活上下文

>>> from hello import app
>>> from flask import current_app
>>> app_ctx=app.app_context()
>>> app_ctx.push()
>>> current_app.name
‘hello‘
>>> app_ctx.pop()

  

PS:

  • app.app_context() 獲取上下文
  • push():激活上下文
  • pop():關閉上下文

請求鉤子

即通用函數的功能,處理請求之前或之後的執行代碼。註冊的函數可在請求被分派到視圖函數之前或之後調用。請求鉤子通過裝飾器實現。

技術分享圖片

請求鉤子函數和視圖函數之間共享數據一般使用上下文全局變量 g

響應

對視圖函數返回的響應添加不同的狀態碼。

方法:把數字代碼作為第二個返回值, 添加到響應文本之後。

@app.route(‘/‘)
def index():
return ‘<h1>Bad Request</h1>‘, 400

  

make_response():返回等效的響應對象

重定向

使用redirect() 函數

from flask import redirect

@app.route(‘/‘)
def index():
return redirect(‘http://www.example.com‘)

  

異常處理

使用abort() 函數

from flask import abort

@app.route(‘/user/<id>‘)
def get_user(id):
user = load_user(id)
if not user:
abort(404)
return ‘<h1>Hello, {}</h1>‘.format(user.name)

  

PS:abort() 不會把控制權交還給調用它的函數,而是拋出異常。

【Flask】Flask學習筆記(一) 應用基本結構