flask 基礎 /上下文管理

  • Django與Flask 有什麼不同?
Django 是大而全,flask短小精湛
相同點: 都是WSGI,用戶請求初次封閉
不同點: Django請求相關數據是通過參數方式傳入。組件多
		 Flask 通過上下文管理實現,組件少,可擴展性強
  • 什麼是WSGI?
wsgi服務網關,是一套協議,實現模塊爲wsgiref werkzeug 本質就是socket服務端用於用戶請求並處理,
  • Flask配置文件?
# 引入配置文件
app.config.from_object('路徑.xx.path')  #字符串	
	三大器 + 反射
	- 反射
  • Flask 路由系統?
用裝飾器@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()中使用過,
  • threading.local作用
- 幫助我們爲每一處線程創建獨自的空間,保證數據的安全性 
- 實現原理: 每一個線程都有自己的唯一標識 放到大字典中,唯一標識爲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')
		


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章