一、簡介
flask中session組件可分為內置的session組件還有第三方flask-session組件,內置的session組件功能單一,而第三方的flask-sessoin可支持redis、memcached、文件等進行session的存儲。以下將介紹內置session以及第三方session組件的使用方法以及處理機制。
二、內置session處理機制
Cookie與Session
Cookie:
Cookie意為“甜餅”,是由W3C組織提出,最早由Netscape社區發展的一種機制。目前Cookie已經成為標準,所有的主流瀏覽器如IE、Netscape、Firefox、Opera等都支持Cookie。由于HTTP是一種無狀態的協議,服務器單從網絡連接上無從知道客戶身份。怎么辦呢?就給客戶端們頒發一個通行證吧,每人一個,無論誰訪問都必須攜帶自己通行證。這樣服務器就能從通行證上確認客戶身份了。這就是Cookie的工作原理。
Cookie實際上是一小段的文本信息。客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。服務器還可以根據需要修改Cookie的內容
Session:
Session是另一種記錄客戶狀態的機制,不同的是Cookie保存在客戶端瀏覽器中,而Session保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上。這就是Session??蛻舳藶g覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了,實質上session就是保存在服務器端的鍵值對。
如果說Cookie機制是通過檢查客戶身上的“通行證”來確定客戶身份的話,那么Session機制就是通過檢查服務器上的“客戶明細表”來確認客戶身份。Session相當于程序在服務器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。
第一次請求,session的創建過程
在flask上下文中介紹了,請求到flask框架會執行wsgi_app方法:
def wsgi_app(self, environ, start_response): ctx = self.request_context(environ) #實例化生成RequestContext對象 error = None try: try: ctx.push() #push上下文到LocalStack中 response = self.full_dispatch_request() #執行視圖函數過程 except Exception as e: error = e response = self.handle_exception(e) #處理異常 except: error = sys.exc_info()[1] raise return response(environ, start_response) finally: if self.should_ignore_error(error): error = None ctx.auto_pop(error) # 刪除LocalStack中的數據
在改方法中會生成一個ctx也就是RequestContext對象:
class RequestContext(object): def __init__(self, app, environ, request=None): self.app = app # app對象 if request is None: request = app.request_class(environ) self.request = request # 封裝request self.url_adapter = app.create_url_adapter(self.request) self.flashes = None self.session = None #一開始的session
新聞熱點
疑難解答