Flask 上下文機制和執行緒隔離
阿新 • • 發佈:2020-07-08
> **1. 電腦科學領域的任何問題都可以通過增加一個間接的中間層來解決**, 上下文機制就是這句話的體現。
>
> **2. 如果一次封裝解決不了問題,那就再來一次**
上下文:相當於一個容器,儲存了Flask程式執行過程中的一些資訊 原始碼:[flask/ctx.py](https://github.com/pallets/flask/blob/master/src/flask/ctx.py)
- 請求上下文:Flask從客戶端收到請求時,要讓檢視函式能訪問一些物件,這樣才能處理請求,要想讓檢視函式能夠訪問請求物件,一個顯而易見的方式是將其作為引數傳入檢視函式,不過這會導致程式中的每個檢視函式都增加一個引數,除了訪問請求物件,如果檢視函式在處理請求時還要訪問其他物件,情況會變得更糟。為了避免大量可有可無的引數把檢視函式弄得一團糟,Flask使用上下文臨時把某些物件變為全域性可訪問。**這就是一種重構設計思路**。
- **request** 封裝了HTTP請求的內容,針對http請求,也是一種符合WSGI介面規範的設計(**關於WSGI可參考我對該協議的理解和實現demo [mini-wsgi-web](https://github.com/Panlq/Py-Project/tree/master/mini-web)**),如 `request.args.get('user')`
- **session** 用來記錄請求會話中的資訊,針對的是使用者資訊,如 `session['name'] = user.id`
- 應用上下文:應用程式上下文,用於儲存應用程式中的變數
- **current_app** 儲存應用配置,資料庫連線等應用相關資訊
- **g變數** 作為flask程式全域性的一個**臨時變數**, 充當者中間媒介的作用,我們可以通過它傳遞一些資料,g儲存的是當前請求的全域性變數,**不同的請求會有不同的全域性變數,通過不同的thread id區別**
```python
# context locals
# 使用代理模式 LocalProxy
_request_ctx_stack = LocalStack()
_app_ctx_stack = LocalStack()
current_app = LocalProxy(_find_app)
request = LocalProxy(partial(_lookup_req_object, 'request'))
session = LocalProxy(partial(_lookup_req_object, 'session'))
g = LocalProxy(partial(_lookup_app_object, 'g'))
```
## 1. working outside application context
```python
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# __author__ = '__JonPan__'
from flask import Flask, current_app
app = Flask(__name__)
a = current_app
# is_debug = current_app.config['DEBUG']
@app.route('/')
def index():
return 'Hello World. Have a nice day! 1>