Flask-cookie&session

關於cookie:

  • 原理: Cookie是由HTTP服務器設置的,保存在瀏覽器中,但HTTP協議是一種無狀態協議,在數據交換完畢後,服務器端和客戶端的鏈接就會關閉,每次交換數據都需要建立新的鏈接。cookie又叫會話跟蹤機制,打開一次瀏覽器到關閉瀏覽器算是一次會話。
  • 區別: session機制採用的是在服務器端保持狀態的方案,而cookie機制則是在客戶端保持狀態的方案。

一、創建cookie

1、如何設置cookie:

  • make_response(),resp.set_cookie設置cookie
  • max_age():設置有效期,單位爲s
  • resp.headers:通過響應頭來設置cookie
from flask import Flask, make_response
def set_cookie():
    """定義的視圖函數"""
    resp = make_response("success")
    # 設置cookie,前爲cookie名,後爲cookie值,默認有效期是臨時cookie,瀏覽器關閉失效
    resp.set_cookie("Itcast", "Python")
    # max_age設置有效期,單位爲s
    resp.set_cookie("Itcast1", "Python1", max_age=3600)
    resp.headers["Set-Cookie"] = "Itcast3=Python3; Expires=Tue, 04-Feb-2020 11:39:45 GMT; Max-Age=3600; Path=/"
    return resp

2、如何查看新建cookie信息:

方法一:
在這裏插入圖片描述方法二:
在這裏插入圖片描述
通過設置響應頭信息,來創建cookie
在這裏插入圖片描述

3、cookie有效期設置:

cookie到期時間默認爲關閉瀏覽器失效
在這裏插入圖片描述 cookie中設置爲1小時max_age=3600,到期時間爲創建cookie後一小時失效。
在這裏插入圖片描述

4、創建cookie過程:

如何創建cookie呢?在響應頭裏,會增加一行Set-Cookie一行,從而創建cookie
在這裏插入圖片描述

二、獲取cookie值:

from flask import Flask,  request
@app.route("/get_cookie")
def get_cookie():
    # 獲取cookie值
    c = request.cookies.get("Itcast")
    return c

在這裏插入圖片描述

三、刪除cookie

  • 刪除cookie值,注意不是當時立即刪除掉,而是將到期時間設置爲創建時間,瀏覽器關閉後自動刪除。
from flask import Flask, make_response
@app.route("/delete_cookie")
def delete_cookie():
    resp = make_response("del success")
    # 刪除cookie
    resp.delete_cookie("Itcast1")
    return resp

在這裏插入圖片描述

四、完整代碼:

from flask import Flask, make_response, request
app = Flask(__name__)


@app.route("/set_cookie")
def set_cookie():
    """定義的視圖函數"""
    resp = make_response("success")
    # 設置cookie,前爲cookie名,後爲cookie值,默認有效期是臨時cookie,瀏覽器關閉失效
    resp.set_cookie("Itcast", "Python")
    # max_age設置有效期,單位爲s
    resp.set_cookie("Itcast1", "Python1", max_age=3600)
    resp.headers["Set-Cookie"] = "Itcast3=Python3; Expires=Tue, 04-Feb-2020 11:39:45 GMT; Max-Age=3600; Path=/"
    return resp


@app.route("/get_cookie")
def get_cookie():
    # 獲取cookie值
    c = request.cookies.get("Itcast")
    return c


@app.route("/delete_cookie")
def delete_cookie():
    resp = make_response("del success")
    # 刪除cookie
    resp.delete_cookie("Itcast1")
    return resp


if __name__ == '__main__':
    print(app.url_map)
    app.run()

關於session

更加深入學習可參考以下鏈接:
https://dormousehole.readthedocs.io/en/latest/
https://pythonhosted.org/Flask-Session/
此處前言及實現原理轉自此鏈接,可跳轉詳細學習:

  • 前言

flask_session是flask框架實現session功能的一個插件,用來替代flask自帶的session實現機制,flask默認的session信息保存在cookie中,不夠安全和靈活。

session是用來幹什麼的呢?由於http協議是一個無狀態的協議,也就是說同一個用戶第一次請求和第二次請求是完全沒有關係的,但是現在的網站基本上有登錄使用的功能,這就要求必須實現有狀態,而session機制實現的就是這個功能。

  • 實現的原理:

用戶第一次請求後,將產生的狀態信息保存在session中,這時可以把session當做一個容器,它保存了正在使用的所有用戶的狀態信息;這段狀態信息分配了一個唯一的標識符用來標識用戶的身份,將其保存在響應對象的cookie中;當第二次請求時,解析cookie中的標識符,拿到標識符後去session找到對應的用戶的信息。

一:設置session數據:

用字典,鍵值的方式進行設置session數據。

from flask import Flask, session

# flask的session所需要用到的密鑰字符串,防止從瀏覽器進行篡改數據
app.config["SECRET_KEY"] = "ksjjdljkjklsjkljlasil"

@app.route("/login")
def login():
    # 設置session數據
    session["name"] = "python"
    session["mobile"] = "15600000000"
    return "login succcess"

二:獲取session數據:

用獲取字典的方式獲取session獲取數據。

@app.route("/index")
def index():
    # 獲取session數據
    name = session.get("name")
    return "hello %s" % name

三、session運行機制:

第一種:保存數據方式:將數據存放在cookie中,瀏覽器發出請求,在後端數據庫中搜索數據,服務器返回session_id=1,瀏覽器接收後存入cookie。
第二種:在路徑中存session數據,輸入路徑進行請求,存入數據庫中,服務器通過redirect返回session_id,通過路徑中設置session_i
在這裏插入圖片描述
在這裏插入圖片描述

四、session保存機制:

session數據除了可以保存在數據庫中,還可以保存在Redis,文件,程序內存裏。通過nginx進行分配訪問多臺服務器,減輕一臺服務器處理數據的壓力。
在這裏插入圖片描述
完整代碼:

from flask import Flask, session
app = Flask(__name__)

# flask的session所需要用到的密鑰字符串,防止從瀏覽器進行篡改數據
app.config["SECRET_KEY"] = "ksjjdljkjklsjkljlasil"

@app.route("/login")
def login():
    # 設置session數據
    session["name"] = "python"
    session["mobile"] = "15600000000"
    return "login succcess"


@app.route("/index")
def index():
    # 獲取session數據
    name = session.get("name")
    return "hello %s" % name


if __name__ == '__main__':
    print(app.url_map)
    app.run()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章