欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python flask基于cookie和session來實(shí)現(xiàn)會(huì)話控制的實(shí)戰(zhàn)代碼

 更新時(shí)間:2024年03月22日 09:29:52   作者:景天科技苑  
所謂的會(huì)話(session),就是客戶端瀏覽器和服務(wù)端網(wǎng)站之間一次完整的交互過程,本文介紹falsk通過cookie和session來控制http會(huì)話的全部解析,通常我們可以用cookie和session來保持用戶登錄等,感興趣的朋友一起看看吧

http的會(huì)話控制

所謂的會(huì)話(session),就是客戶端瀏覽器和服務(wù)端網(wǎng)站之間一次完整的交互過程.

會(huì)話的開始是在用戶通過瀏覽器第一次訪問服務(wù)端網(wǎng)站開始.

會(huì)話的結(jié)束時(shí)在用戶通過關(guān)閉瀏覽器以后,與服務(wù)端斷開.

所謂的會(huì)話控制,就是在客戶端瀏覽器和服務(wù)端網(wǎng)站之間,進(jìn)行多次http請求響應(yīng)之間,記錄、跟蹤和識(shí)別用戶的信息而已。

為什么要有會(huì)話控制?因?yàn)?http 是一種無狀態(tài)協(xié)議,瀏覽器請求服務(wù)器是無狀態(tài)的。

無狀態(tài):指一次用戶請求時(shí),瀏覽器、服務(wù)器無法知道之前這個(gè)用戶做過什么,對于服務(wù)端而言,客戶端的每次請求都是一次新的請求。

無狀態(tài)原因:瀏覽器與服務(wù)器是使用 socket 套接字進(jìn)行通信的,服務(wù)器將請求結(jié)果返回給瀏覽器之后,會(huì)關(guān)閉當(dāng)前的 socket 連接,而且客戶端也會(huì)在處理頁面完畢之后銷毀頁面對象。

有時(shí)需要保持下來用戶瀏覽的狀態(tài),比如用戶是否登錄過,瀏覽過哪些商品等

實(shí)現(xiàn)狀態(tài)保持主要有兩種方式:

  • 在客戶端存儲(chǔ)信息使用Cookie(廢棄),token[jwt,oauth]
  • 在服務(wù)器端存儲(chǔ)信息使用Session,數(shù)據(jù)庫

Cookie

Cookie是由服務(wù)器端生成,發(fā)送給客戶端瀏覽器,瀏覽器會(huì)將Cookie的key/value保存,下次請求同一網(wǎng)站時(shí)就隨著請求頭自動(dòng)發(fā)送該Cookie給服務(wù)器(前提是瀏覽器設(shè)置為啟用cookie)。
Cookie的key/value可以由服務(wù)器端自己定義。

使用場景: 登錄狀態(tài), 瀏覽歷史, 網(wǎng)站足跡,購物車 [不登錄也可以使用購物車]

Cookie是存儲(chǔ)在瀏覽器中的一段純文本信息,建議不要存儲(chǔ)敏感信息如密碼,因?yàn)殡娔X上的瀏覽器可能被其它人使用

Cookie基于域名安全,不同域名的Cookie是不能互相訪問的

如訪問fuguang.com時(shí)向?yàn)g覽器中寫了Cookie信息,使用同一瀏覽器訪問baidu.com時(shí),無法訪問到fuguang.com寫的Cookie信息,只能獲取到baidu.com的Cookie信息。

瀏覽器的同源策略針對cookie也有限制作用.

當(dāng)瀏覽器請求某網(wǎng)站時(shí),瀏覽器會(huì)自動(dòng)將本網(wǎng)站下所有Cookie信息隨著http請求頭提交給服務(wù)器,所以在request中可以讀取Cookie信息

1.設(shè)置cookie

設(shè)置cookie需要通過flask的Response響應(yīng)對象來進(jìn)行設(shè)置,由響應(yīng)對象會(huì)提供了方法set_cookie給我們可以快速設(shè)置cookie信息。

視圖函數(shù)如下:

@app.route("/set_cookie")
def set_cookie():
    """設(shè)置cookie,通過response傳遞到客戶端進(jìn)行保存"""
    response = make_response('默認(rèn)首頁')
    response.set_cookie('username', 'jingtian')            # session會(huì)話期有效,關(guān)閉瀏覽器后當(dāng)前cookie就會(huì)被刪除 如果沒有設(shè)置max_age,則當(dāng)前cookie變量會(huì)在瀏覽器關(guān)閉(會(huì)話結(jié)束以后被瀏覽器刪除)
    response.set_cookie('user', 'jigntian', max_age=30 )   # 指定有效時(shí)間,過期以后瀏覽器刪除cookie,max_age=30秒
    return response

瀏覽器查看cookie

2.獲取cookie

#獲取cookie
@app.route("/get_cookie")
def get_cookie():
    """獲取來自客戶端的cookie"""
    print(request.cookies)  # ImmutableMultiDict([])
    username = request.cookies.get('username')  # 沒有值則返回None
    user = request.cookies.get('user')          # 沒有值則返回None
    print(f"username={username},user={user}")   # username=xiaoming,user=xiaoming
    return "get cookie"

瀏覽器訪問

終端打印,失效的cookie獲取不到位None

3.刪除cookie

cookie保存客戶端瀏覽器中的,所以服務(wù)端無法直接刪除cookie
要實(shí)現(xiàn)刪除cookie,只能告訴瀏覽器,cookie過期了,讓瀏覽器自動(dòng)刪除
刪除cookie,重新設(shè)置cookie的時(shí)間,讓瀏覽器自己根據(jù)有效期來刪除

#刪除cookie
@app.route("/del_cookie")
def del_cookie():
    response = make_response('del cookie')
    # 刪除操作肯定是在瀏覽器完成的,所以我們重置下cookie名稱的對飲有效時(shí)間為0,此時(shí)cookie的值已經(jīng)不重要了。
    response.set_cookie('user', '', max_age=0)
    response.set_cookie('username', '', max_age=0)
    return response

瀏覽器訪問,課件瀏覽器cookie已被刪除

完整代碼:

from flask import Flask, make_response,request
# 應(yīng)用實(shí)例對象
app = Flask(__name__)
#設(shè)置cookie
@app.route("/set_cookie")
def set_cookie():
    """設(shè)置cookie,通過response傳遞到客戶端進(jìn)行保存"""
    response = make_response('默認(rèn)首頁')
    response.set_cookie('username', 'jingtian')            # session會(huì)話期有效,關(guān)閉瀏覽器后當(dāng)前cookie就會(huì)被刪除
    response.set_cookie('user', 'jigntian', max_age=30 )   # 指定有效時(shí)間,過期以后瀏覽器刪除cookie,max_age=30秒
    return response
#獲取cookie
@app.route("/get_cookie")
def get_cookie():
    """獲取來自客戶端的cookie"""
    print(request.cookies)  # ImmutableMultiDict([])
    username = request.cookies.get('username')  # 沒有值則返回None
    user = request.cookies.get('user')          # 沒有值則返回None
    print(f"username={username},user={user}")   # username=jigntian,user=jigntian
    return "get cookie"
#刪除cookie
@app.route("/del_cookie")
def del_cookie():
    # cookie保存客戶端瀏覽器中的,所以服務(wù)端無法直接刪除cookie
    # 要實(shí)現(xiàn)刪除cookie,只能告訴瀏覽器,cookie過期了,讓瀏覽器自動(dòng)刪除
    """刪除cookie,重新設(shè)置cookie的時(shí)間,讓瀏覽器自己根據(jù)有效期來刪除"""
    response = make_response('del cookie')
    # 刪除操作肯定是在瀏覽器完成的,所以我們重置下cookie名稱的對飲有效時(shí)間為0,此時(shí)cookie的值已經(jīng)不重要了。
    response.set_cookie('user', '', max_age=0)
    response.set_cookie('username', '', max_age=0)
    return response
if __name__ == '__main__':
    # 啟動(dòng)項(xiàng)目的web應(yīng)用程序
    app.run(host="0.0.0.0", port=5000, debug=True)

cookie各階段操作流程

Session

對于敏感、重要的信息,建議要存儲(chǔ)在服務(wù)器端,不能存儲(chǔ)在瀏覽器中,如手機(jī)號(hào)、驗(yàn)證碼等信息

在服務(wù)器端進(jìn)行狀態(tài)保持的方案就是Session

Session依賴于Cookie,session的ID一般默認(rèn)通過cookie來保存到客戶端。名字一般叫:session

flask中的session需要加密,所以使用session之前必須配置SECRET_KEY選項(xiàng),否則報(bào)錯(cuò).

如果將來希望session的生命周期延長,可以通過修改cookie中的sessionID的有效期來完成配置。

session實(shí)現(xiàn)方案

注意:一般框架都是把session數(shù)據(jù)保存到服務(wù)端,但是,flask里面的session是基于token方式存儲(chǔ)在客戶端的,并沒有按照傳統(tǒng)的方式保存在服務(wù)端的文件中。

session的ID存在有效期的,默認(rèn)是會(huì)話期,會(huì)話結(jié)束了,session_id就廢棄了。

1.設(shè)置session

設(shè)置session視圖函數(shù)如下:

#因?yàn)閒alsk中的session是基于cookie加密實(shí)現(xiàn)的,所以使用之前必須設(shè)置SECRET_KEY選項(xiàng)

app.config['SECRET_KEY'] = 'dafssg231bfvxvdsfwrqdqfafaffsgsbfsfsgs'
#設(shè)置session
@app.route("/set_session")
def set_session():
    """設(shè)置session"""
    session['username'] = 'jingtian'
    session['info'] = {
        "name": "jingtian",
        "age": 16,
    }
    print(session,type(session))
    return "set_session"

瀏覽器訪問,session保存到客戶端的cookie中

看下session和類型

2.設(shè)置session有效期

 后端Flask跟瀏覽器交互默認(rèn)情況下,session cookie會(huì)在用戶關(guān)閉瀏覽器時(shí)清除。

通過將session.permanent屬性設(shè)為True可以將session的有效期延長為31天,也可以通過操作app的配置PERMANENT_SESSION_LIFETIME來設(shè)置session過期時(shí)間。
設(shè)置有效期,需要到導(dǎo)包

from datetime import timedelta
# 以下兩步設(shè)置過期時(shí)間
session.permanent = True # 開啟設(shè)置有效期,默認(rèn)為31天后過期
app.permanent_session_lifetime = timedelta(minutes=10)
return "set_session"

瀏覽器訪問,可以看到session有效期為10分鐘

4.獲取session

@app.route("/get_session")
def get_session():
    """獲取session"""
    print(session.get('username'))
    print(session.get('info'))
    return "get session"

瀏覽器訪問

終端打印session

5.刪除session

@app.route("/del_session")
def del_session():
    """刪除session,鍵如果不存在,則會(huì)拋出異常,所以刪除之前需要判斷鍵是否存在。"""
    if "username" in session:
        session.pop("username")
    if "info" in session:
        session.pop("info")
    return "del_session"

瀏覽器訪問,session被刪除

完整代碼:

from flask import Flask, session
from datetime import timedelta
# 應(yīng)用實(shí)例對象
app = Flask(__name__)
#因?yàn)閒alsk中的session是基于cookie加密實(shí)現(xiàn)的,所以使用之前必須設(shè)置SECRET_KEY選項(xiàng)
app.config['SECRET_KEY'] = 'dafssg231bfvxvdsfwrqdqfafaffsgsbfsfsgs'
#設(shè)置session
@app.route("/set_session")
def set_session():
    """設(shè)置session"""
    session['username'] = 'jingtian'
    session['info'] = {
        "name": "jingtian",
        "age": 16,
    }
    print(session,type(session))
    # 以下兩步設(shè)置過期時(shí)間
    session.permanent = True # 開啟設(shè)置有效期,默認(rèn)為31天后過期
    app.permanent_session_lifetime = timedelta(minutes=10)
    return "set_session"
#獲取session
@app.route("/get_session")
def get_session():
    """獲取session"""
    print(session.get('username'))
    print(session.get('info'))
    return "get session"
#刪除session
@app.route("/del_session")
def del_session():
    """刪除session,鍵如果不存在,則會(huì)拋出異常,所以刪除之前需要判斷鍵是否存在。"""
    if "username" in session:
        session.pop("username")
    if "info" in session:
        session.pop("info")
    return "del_session"
if __name__ == '__main__':
    # 啟動(dòng)項(xiàng)目的web應(yīng)用程序
    app.run(host="0.0.0.0", port=5000, debug=True)

使用過程中,session是依賴于Cookie的,所以當(dāng)cookie在客戶端被刪除時(shí),對應(yīng)的session就無法被使用了。

總結(jié):
綜上,就是falsk通過cookie和session來控制http會(huì)話的全部解析,通常我們可以用cookie和session來保持用戶登錄等,falsk持續(xù)更新中,總有適合你的?。?!

到此這篇關(guān)于python flask基于cookie和session來實(shí)現(xiàn)會(huì)話控制的文章就介紹到這了,更多相關(guān)python 會(huì)話控制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python的廣播機(jī)制詳解

    python的廣播機(jī)制詳解

    大家好,本篇文章主要講的是python的廣播機(jī)制詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Python中不可忽視的docstring妙用

    Python中不可忽視的docstring妙用

    docstring是Python中用于記錄模塊、類、方法和函數(shù)行為的字符串,幫助開發(fā)者和用戶快速了解代碼的功能和用法,本文將詳細(xì)介紹docstring的使用,需要的可以參考下
    2024-12-12
  • python pands實(shí)現(xiàn)execl轉(zhuǎn)csv 并修改csv指定列的方法

    python pands實(shí)現(xiàn)execl轉(zhuǎn)csv 并修改csv指定列的方法

    今天小編就為大家分享一篇python pands實(shí)現(xiàn)execl轉(zhuǎn)csv 并修改csv指定列的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python 抓取數(shù)據(jù)存儲(chǔ)到Redis中的操作

    Python 抓取數(shù)據(jù)存儲(chǔ)到Redis中的操作

    這篇文章主要介紹了Python 抓取數(shù)據(jù)存儲(chǔ)到Redis中的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • 使用Python設(shè)置,更新和獲取Excel單元格的值

    使用Python設(shè)置,更新和獲取Excel單元格的值

    Excel工作簿作為一款廣泛使用的數(shù)據(jù)管理工具,與Python相結(jié)合,可以使得自動(dòng)化處理大量數(shù)據(jù)成為可能,本文將演示如何使用Python設(shè)置、更新以及獲取Excel文件中單元格的值,希望對大家有所幫助
    2024-10-10
  • Django日志模塊logging的配置詳解

    Django日志模塊logging的配置詳解

    日志在程序開發(fā)中是少不了的,通過日志我們可以分析到錯(cuò)誤在什么地方,有什么異常。在生產(chǎn)環(huán)境下有很大的用處。在java 開發(fā)中通常用 log4j,logback 等三方組件。下面這篇文章主要介紹了Django日志模塊logging的相關(guān)資料,需要的朋友可以參考下。
    2017-02-02
  • Python?pandas按行、按列遍歷DataFrame的幾種方式

    Python?pandas按行、按列遍歷DataFrame的幾種方式

    在python的DataFrame中,因?yàn)閿?shù)據(jù)中可以有多個(gè)行和列,而且每行代表一個(gè)數(shù)據(jù)樣本,我們可以將DataFrame看作數(shù)據(jù)表,那你知道如何按照數(shù)據(jù)表中的行遍歷嗎,下面這篇文章主要給大家介紹了關(guān)于Python?pandas按行、按列遍歷DataFrame的幾種方式,需要的朋友可以參考下
    2022-09-09
  • 一文帶你探索Python生成器的深度用法

    一文帶你探索Python生成器的深度用法

    生成器是Python的一種核心特性,允許我們在請求新元素時(shí)再生成這些元素,而不是在開始時(shí)就生成所有元素,本文我們將從理論和實(shí)踐兩方面來探索Python生成器的深度用法,感興趣的可以了解一下
    2023-06-06
  • 基于PyQT5制作一個(gè)課堂點(diǎn)名系統(tǒng)

    基于PyQT5制作一個(gè)課堂點(diǎn)名系統(tǒng)

    這篇文章主要為大家介紹一個(gè)基于PyQt5實(shí)現(xiàn)的抖音同款課堂點(diǎn)名系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試
    2022-02-02
  • Django中常用的查詢數(shù)據(jù)方法及查詢對象的條件詳解

    Django中常用的查詢數(shù)據(jù)方法及查詢對象的條件詳解

    在web 開發(fā)過程中,Django 與后臺(tái)數(shù)據(jù)庫的交互是必不可少的一項(xiàng),也是實(shí)現(xiàn)業(yè)務(wù)邏輯所需數(shù)據(jù)的重要方式,這篇文章主要給大家介紹了關(guān)于Django中常用的查詢數(shù)據(jù)方法及查詢對象條件的相關(guān)資料,需要的朋友可以參考下
    2021-09-09

最新評論