從Flask框架中淺談session和cookies

大家在爬蟲的時候,經常需要處理cookies和session登錄的問題,能否拿到session和cookies對於重複登錄至關重要,那cookies和session是什麼,又是如何使用的呢?小編將以輕量級Flask框架為基礎,從前後端實現的角度對此問題進行解答:

cookies是一種數據存儲手段,能將一段文本保存在客戶端(瀏覽器)的一種存儲手段,並可以長時間保存,其主要使用場景包括密碼記憶、搜索關鍵詞記憶, cookies主要特點是以瀏覽器為單位,不同的瀏覽器之間的cookies是不共享的,同時,各個網站之間的cookies也是相互獨立的,cookies可以解決服務器端的一些存儲問題,允許將非重要的數據保存在客戶端瀏覽器中,從而節省服務器端的位置,並可以長時間保存數據,其缺點就是明文顯示所有的數據,並且cookies內容在客戶端是允許被修改的。

在Flask框架中,要通過設置響應對象將cookies從服務器端帶到瀏覽器上並進行保存,而響應對象又主要分為兩種,resp = redirect('/重定向地址')和resp = make_response("字符串"|render_template())都是響應對象,在相應對象的基礎上就可以添加cookies,語法為:響應對象.set_cookie(key,value,max_age),其中key為要保存的cookies的名稱,value為要保存的cookies的值,max_age為cookies存活的最大時間(60*60*24*365表示1年),而為了識別cookies的正確性經常需要獲取cookies,以cookies免登錄界面為例,每當瀏覽器向服務器發送get請求時,都會把當前站點的cookies封裝到請求頭中並帶給服務器,通過與後臺數據庫的交互,實現免登錄操作,而cookies的獲取主要通過request.cookies實現,當用戶退出時,可以刪除cookies,語法為:響應對象.delete_cookie('key'),具體業務操作如圖所示:

從Flask框架中淺談session和cookies

Flask框架中cookies操作

從Flask框架中淺談session和cookies

cookies瀏覽器端顯示

而session是保存在服務器上,為每個瀏覽器所開闢的一段空間,至於哪些數據需要通過session保存呢?服務器端在會話過程中經常要用到的,且安全性要求較高的數據,需要保存進session,例如小編之前做的登錄網頁,在post請求響應成功後需要通過request.headers.get('Referer','/')獲取源地址網頁url並進行跳轉,但由於先進行了get請求,因此獲取不到最原始的源地址網頁,這裡可以在get請求前獲取請求源地址,並存放進session,如果沒有請求源地址,則將 / 保存進session,然後在post請求後通過session.get('url','/')獲取源地址,並使用響應對象 redirect(url)進行跳轉,這是一個session的應用。

在Flask框架中,對於session保存數據的實現,首先需要配置SECRET_KEY,app.config['SECRET_KEY']='nicai',括號內為初始自定義,導入flask. session方法,通過語法session['key'] = value保存數據到服務器中, 如果要獲取session中的數據,可以通過語法value=session['key']或value=session.get('key')實現,如果需要從session中刪除數據,可以通過語法del session['key']實現。

從Flask框架中淺談session和cookies

Flask框架中session操作

從Flask框架中淺談session和cookies

session瀏覽器端顯示

下面就以登錄界面為例,說明session和cookies的綜合應用,代碼如下:

從Flask框架中淺談session和cookies

登錄頁get請求

從Flask框架中淺談session和cookies

登錄頁post請求

訪問路徑http://localhost:5000/login,首先是get請求,將源地址保存在session中,並判斷session中是否含有uname,如果有,則請求源地址;若沒有session信息,判斷瀏覽器端是否含有cookies信息,由於cookies信息可以在瀏覽器端被修改,因此要與服務器端數據庫進行交互比對,比對正確,保存session信息,則請求源地址;若既沒有session信息,也沒有cookies信息,則返回登錄界面進行登錄;登錄頁填寫信息後,發送post請求,服務器端接受表單信息,將表單信息與數據庫hash加密信息進行比對,若通過,則登錄成功,保存session信息,並請求源地址,並判斷是否要存cookies(即網頁中選填是否記住密碼);若不通過,則登錄失敗,並返回登錄界面,提示“用戶名或密碼錯誤”。

這只是登錄頁的基本代碼,還有很多bug,例如,如果記住某人的cookies信息,就可以通過改變瀏覽器端的cookies信息,實現免登錄操作,受制於水平的有限,這裡只從服務器框架的角度給大家簡單介紹一下session和cookies,需要交流和切磋的讀者朋友,請在評論區積極留言,歡迎關注頭條號:杜哥說python。


分享到:


相關文章: