作過爬蟲的朋友相信對 session 和 cookie 這兩個東西很是的熟悉了,簡單點說 cookie 是客戶端用來標識用戶信息的,session 是一種會話機制,python
首先咱們要對 cookie 的整個流程有個清晰的認知:作過爬蟲的都知道瀏覽器向服務器發起某個登陸請求,登陸成功後的 Response Headers 中就有了 cookie 。編程
那麼這個 cookie 就是從服務器生成並返回給瀏覽器的,接着登陸後的用戶才能訪問其餘頁面。flask
好比登陸淘寶後才能訪問本身的購物車,這時候能訪問成功就是由於本次請求帶上了登陸成功後的 cookie。瀏覽器
不熟悉的朋友,能夠看下我之前寫的一篇文章安全
那麼問題來了咱們如何在服務器或者說後臺設置 cookie 和 session 呢?cookie
咱們來看下如何在 Flask 中操做 cookie,按照上面的思路,cookie 是從響應中獲得的,因此咱們在 Flask 返回的響應中即 make_response 中設置 cookie。session
在這裏提一下,Flask 將請求相關的都封裝在 request 當中, 同理咱們能夠經過 make_response 來設置響應相關的數據。app
from flask import Flask, make_response
app = Flask(__name__)
@app.route('/set_cookie')
def hello_world():
resp = make_response("success")
resp.set_cookie("name", "python")
resp.set_cookie("name2", "go")
return resp複製代碼
上面代碼設置了兩個 cookie,設置完以後,咱們啓動服務而後經過瀏覽器來訪問該地址,按下 F12 以後就能看到你設置的 cookie.this
能夠看到響應頭中的 cookie, 瀏覽器會自動將其保存下來,在你下次訪問的時候會帶上這兩個 cookie 。
咱們用下面的代碼來驗證下:
from flask import request
@app.route("/index")
def index():
cookie = request.cookies
return f" this is {cookie}"複製代碼
啓動以後,訪問 http://127.0.0.1:5000/index
請求頭中有 cookie 數據,同時後臺能獲取到用戶的 cookie.
cookie 都是有有效期的,細心的朋友應該能夠發現上面的 cookie 並無設置有效期,關閉瀏覽器後該 cookie 也就失效了
在 set-cookie 中能夠用 max_age, expires 來設置 cookie 的有效期,
其中 max_age 是以秒爲單位的,expires 是時間戳或者以 datetime 格式對象數據
咱們能夠在上面的 hello_world 中添加第三個 cookie 數據
@app.route('/set_cookie')
def hello_world():
resp = make_response("success")
resp.set_cookie("name", "python")
resp.set_cookie("name2", "go")
resp.set_cookie("name3", "jerry", max_age=7200)
return resp複製代碼
一樣重啓後瀏覽器中輸入地址,查看 cookie
刪除 cookie 用到的方法是 delete_cookie, 咱們將需求刪除的 cookie 的鍵傳過去便可,
@app.route('/delete')
def delete():
resp = make_response("delete test")
resp.delete_cookie("name")
return resp複製代碼
驗證結果以下:
發現沒有,name 的建立時間和到期時間是同樣的。
session和cookie的做用有點相似,都是爲了存儲用戶相關的信息的,區別在於 session 是保存在服務器端的,用 session_id 來標識用戶。而 cookie 是保存在客戶端,session 的出現,是爲了解決 cookie 存儲數據不安全的問題的。
在 flask 中咱們能夠導入 flask.session 來操做 session, 使用方法和 python 中的字典差很少
from flask import session
@app.route("/login")
def login():
session["name"] = "jerry"
session["account"] = "python"
return "success"複製代碼
注意處理 session 的時候,須要設置 SECRET_KEY,由於 flask 要用該值來對 session 進行加密和混淆 。
class Config(object):
SECRET_KEY = "DJFAJLAJAFKLJQ"
app.config.from_object(Config())複製代碼
和字典用法相似,能夠用 get 方法 或者直接取值
@app.route("/index")
def index():
name = session.get("name")
return f" hello {name}"複製代碼
session.pop("name")
del session["name"]
session.clear() 複製代碼
其中 clear() 直接將 session 所有清空.
以上即是今天的所有內容,但願各位看官喜歡。
瞭解更多內容,煩請關注公衆號 Python編程與實戰