Django 是大而全,flask短小精湛
相同點: 都是WSGI,用戶請求初次封閉
不同點: Django請求相關數據是通過參數方式傳入。組件多
Flask 通過上下文管理實現,組件少,可擴展性強
wsgi服務網關,是一套協議,實現模塊爲wsgiref werkzeug 本質就是socket服務端用於用戶請求並處理,
app.config.from_object('路徑.xx.path')
三大器 + 反射
- 反射
用裝飾器@app.route()
參數
- url
- endpoint 反向生成URL
- methods 對應數據類型是一個列表
自定義 + 裝飾器時
- endpoint 默認是函數名
- functools.wraps(func)
寫路由的兩種方式:
- 裝飾器
- add_url_rule
路由默認不支持正則,但是自定義支付正則
- 目錄結構的劃分
- 前綴
- 特殊裝飾器
- befor_first_request - before_request - after_request
- template_gloable() - template_filter() - errorhandler()
functools.partial
作用:幫助開發者自動傳入參數,在LocalStack()中使用過,
- 幫助我們爲每一處線程創建獨自的空間,保證數據的安全性
- 實現原理: 每一個線程都有自己的唯一標識 放到大字典中,唯一標識爲KEY 如果想着力度增強可以把線程的唯一標識換成協程
- 應用:DBUtils中爲每一個進程創建數據庫連接時使用
請求到來:
- 將請求和sessions封裝到ctx=requestContext()對象中
- 將app和g封裝到ctx=appContext()對象中
- 通過localstack對象 將ctx和appctx 封裝到local對象中
問題:
1 local是什麼?以及作用?
目的就是存儲數據,維護成一個字典
作用:在flask中根據每一個協程開闢空間,讓數據存儲保證數據之間的隔離
存儲格式:__storage__={協程唯一id:{stack:[ctx 棧]}}
2 localstack是什麼?作用?
將__storage__維護成一個棧
方法:push()\pop()
3 localProxy作用:
在視圖中通過localproxy去__storage__中獲取數據,獲取數據交給視圖
4 befor_request實現原理:
執行時機,是在local之前,視圖之前 放到一個列表中, 循環列表函數,如果函數沒有返回值執行視圖函數
- 視圖獲取數據: 通過localPorxy+偏函數,內部調用localstack獲取ctx和app_stack對象中封裝的值
問題:
1 爲什麼把 ctx=requext/session app_ctx=app/g
2 爲什麼把request/session放到ctx中,app和g放到app_ctx中?
答:因爲離線腳本會用到app_ctx,而不需要使用ctx
- 請求結束:
調用localstack的pop方法,將ctx和app_ctx移除
-------------------------------------------------------------------------
- 什麼時候使用app上下文管理
配置文件
current_app.Config
- 請求上下文管理 - 請求週期(request,session)(ctx)
1).當請求到來,wsgi調用__call__方法,call方法再調用 wsgi_app方法,wsgi_app首先將相關請求+空session封裝到一個request_context對象中(ctx),
2).再次將ctx push 給LocalStack對象,
3).再由LocalStack將ctx添加到local中,
4).local的結構就是一個storage={線程或協和的唯一標識:{stack:[棧 ctx]}},注:stack的目的就是維護列表,是一個棧 ;
4).根據請求中的cookie中的提取sessionid對應的值,對cookie進行解密和反序列化,再次給ctx中的session進行賦值,
5).執行視圖函數,
6).然後再次把session中的數據寫入到cookie中,
7).將ctx刪除,
8).結果返回給用戶瀏覽器,
9).斷開Socket連接
class Stack(object):
def push(self,item)
pass
def pop(self):
pass
後進先出
class Stack(object):
def push(self,item)
pass
def pop(self):
pass
先進先出
flask-session
DBUtils 第一種方式:每一個線程開僻一個連接 ;第二種方式 創建連接池 用一個拿一個
wtforms
作用:
1) 生成html標籤
2) form表單驗證(用戶請求數據校驗)
安裝:
pip install wtforms
使用:
day119 用戶登錄 註冊 從數據庫獲取數據 時實更新(靜態字段) 重寫構造方法 def __init__
def __init__(self,*args,**kwargs):
super(IndexForm,self).__init__(*args,**kwargs)
self.fields['group'].choices=models.User.object.all().values_list('id','name')