cookie是保存在瀏覽器上的鍵值對
session是存在服務端的鍵值對(服務端的session就是一個大字典,字典中是隨機字符串)(session與request原理相同)(session原理跟上下文也有關係)
session依賴於cookie存在
session流程
當請求第一次進來,生成隨機字符串
-發給用戶cookie
-保存到session字典中時
它調用stark將隨機字符串和對應的值放到local
視圖函數
-使用時導入用top(它拿的是session)
session=LocalProxy(partile(_lookup_req_object,'session '))
請求處理完畢:
內存處理完畢後,將session作持久化(session存到數據庫,存到Redis,存到加密的cookie中)瀏覽器
2、session源碼解析
1.先執行Flask的__call__方法 ,調用出來wsgi_app,它先作request的上下文作完,請求剛進來到push中,它先處理request將請求相關的數據,而後添加到了local中,
緊接着處理session(將RequestContext對象(request,session)添加到local中),request(將request信息封裝到Request(environ)對象並複製給requestContext 對 象),而後獲取cookie中的隨機字符串,檢驗是否有,沒有就生成。根據隨機字符串,獲取服務端session保存的值。把session放到內存中,
執行wsgi_app方法下面的視圖函數。執行完視圖函數返回到full_dispatch_requesthong ,觸發只執行一次的裝飾器中(觸發Flask信號),
執行完這個裝飾器,緊接着執行下面的特殊的裝飾器,若是這些特殊裝飾器沒有返回值,那麼rv=None,若是有返回值,頁面時就顯示這個返回值,
若是沒有返回值,觸發執行那個視圖函數,拿返回值。請求執行完返回後,調用finalize_request,對它的返回值進行封裝。cookie
如何處理的request ctx = self.request_context(environ) 將request信息封裝到Request(environ)對象並複製給 requestContext 對象 class RequestContext: def __init__(self, app, environ, request=None): self.app = app if request is None: request = app.request_class(environ) self.request = request self.url_adapter = app.create_url_adapter(self.request) self.flashes = None self.session = None 如何處理的session class RequestContext: def push(self): 將RequestContext對象(request,session)添加到local中 _request_ctx_stack.push(self) 剛開始處理session #return app.session _interface.open_session(self,request) #app.session _interface=SecureCookieSessionInterface() self.session = self.app.open_session(self.request) if self.session is None: self.session = self.app.make_null_session()
3、Flask和Django的區別
請求相關的數據session
-Django:參數多線程
-Flask: 基於Local,LocalStark對象app
多個請求進來會不會混淆ide
-單線程函數
-多線程post
-協程加密
解決: from greenlet import getcurrent as get_ident