Django框架之Cookie和Session和CBV加裝飾器的三種方法

【一】Cookie與Session

Cookie和Session是用來在Web應用程序中跟蹤用戶會話數據的兩種常用技術。

【1】Cookie和Session的發展史

【1】Cookie的發展史:

  1. 1994年,網景通信公司推出了第一個瀏覽器Cookie技術。Cookie是存儲在用戶計算機上的小型文本文件,用于跟蹤用戶在網站上的活動。
  2. 初始版本的Cookie只能存儲很少的數據,并且沒有強制加密機制,容易被惡意用戶篡改或竊取。因此,隨著互聯網的快速發展,Cookie引起了一系列安全和隱私問題。

【2】Session的發展史:

  1. 由于Cookie存在的局限性,Web開發人員開始尋找更安全、可靠的替代方案。1997年,Sun Microsystems提出了基于服務器的會話管理方案,即Session。
  2. Session是在服務器端存儲用戶會話數據的一種技術。每當用戶訪問網站時,服務器會為其創建一個唯一的Session標識符(Session ID),并將會話數據存儲在服務器上。
  3. Session ID一般通過Cookie或URL參數傳遞給客戶端,用于識別用戶的會話狀態。

【2】Cookie和Session的關系:

  1. 在實際應用中,Cookie和Session通常結合使用。當用戶首次訪問網站時,服務器會為其分配一個唯一的Session ID,并將其存儲在Cookie中,發送給客戶端保存。
  2. 隨后,客戶端在每次請求中都會攜帶該Cookie,服務器通過解析Cookie中的Session ID,讀取對應的會話數據,實現用戶狀態的跟蹤和管理。

【1】總結:

  • Cookie和Session是Web應用程序中常用的用戶會話跟蹤技術。
  • Cookie通過在客戶端存儲小型文本文件,并將會話標識符傳遞給服務器,實現會話狀態的保持。
  • 而Session則是在服務器端存儲會話數據,通過Session ID實現對用戶會話的追蹤。
  • 它們的發展歷程與互聯網的發展緊密相關,為開發人員提供了更多的選擇,以保障安全性和用戶體驗的提升。

【3】Cookie與Session詳解

【1】Cookie

  • 服務器保存在客戶端瀏覽器上的信息都可以稱之為cookie
  • 它的表現形式一般都是k:v鍵值對(可以有多個)

【2】Session

  • 保存在服務器上的信息都可以稱之為session
  • 它的表現形式一般都是k:v鍵值對(可以有多個)

【3】token

  • session雖然數據是保存在服務端的,但是擋不住數據量大
  • 解決辦法:服務端不再保存數據
    • 登陸成功之后,將一段信息加密處理(用自己獨特的加密方式進行加密)
  • 將加密之后的結果拼接在信息后面,整體返回給瀏覽器保存
  • 瀏覽器下次訪問的時候帶著該信息,服務端自動切取前面的一段信息再次使用自己的加密算法進行加密
  • 然后用這段密文與攜帶過來的密文進行比對

【4】總結

  • cookie就是保存在客戶端瀏覽器上的信息
  • session就是保存在服務端上的信息
  • session是基于cookie工作的(其實大部分的保存用戶狀態的操作都需要使用cookie)

【2】Django操作Cookie

  • 雖然cookie是服務端告訴客戶端瀏覽器需要保存內容
  • 但是客戶端瀏覽器可以選擇拒絕保存
  • 如果禁止自動保存cookie
    • 那么只要是需要登錄的網站都沒辦法正常登錄了

【1】三板斧-視圖函數返回

- return HttpResponse() 
- return render() 
- return redirect()
obj = HttpResponse("ok")
obj.set_cookie('k','v')

【2】設置cookie

def login(request, *args, **kwargs):if request.method == 'POST':username = request.POST.get("username")password = request.POST.get("password")if username == "dream" and password == "521":obj = HttpResponse("ok")obj.set_cookie('sign', 'user')return objelse:return redirect('/login/')return render(request, 'login.html')
  • 取值cookie驗證
def home(request, *args, **kwargs):sign = request.COOKIES.get('sign')if sign and sign == 'user':return HttpResponse("這是home頁面")else:return redirect('/login/')

【3】取值

request.COOKIES.get('k')

【4】設置超時時間

obj.set_cookie('sign', 'user', expires=3)
obj.set_cookie('sign', 'user', max_age=3)
#設置超時時間3s到期
  • max_age

    • 設置超時時間,以秒為單位

  • expiress

    • 設置超時時間 針對IE瀏覽器使用,以秒為單位

【5】注銷cookie

def logout(request, *args, **kwargs):obj = redirect('/home/')# 設置超時時間 3s 到期obj.delete_cookie('sign')return obj

【6】完整版 cookie登錄注冊

def login(request, *args, **kwargs):# next_url = request.get_full_path()# print(next_url) # /login/?next_url=/home/if request.method == 'POST':username = request.POST.get("username")password = request.POST.get("password")if username == "dream" and password == "521":next_url = request.GET.get('next_url')# print(next_url) # /home/obj = redirect(next_url)obj.set_cookie('sign', 'user')return objelse:return redirect('/login/')return render(request, 'login.html')def login_auth(func):def inner(request, *args, **kwargs):# print(request.path_info) #  /home/# print(request.get_full_path()) # /home/?username=111next_url = request.get_full_path()  # /home/# print(next_url)# /home/sign = request.COOKIES.get('sign')if sign and sign == 'user':res = func(request, *args, **kwargs)return reselse:return redirect(f'/login/?next_url={next_url}')return inner@login_auth
def home(request, *args, **kwargs):return HttpResponse("這是home頁面")# def home(request, *args, **kwargs):
#     sign = request.COOKIES.get('sign')
#     if sign and sign == 'user':
#         return HttpResponse("這是home頁面")
#     else:
#         return redirect('/login/')@login_auth
def index(request, *args, **kwargs):return HttpResponse("這是index頁面")

【3】Django操作Session

  • session數據是保存在服務端的,給客戶端返回的是一個隨機字符串
    • sessionid:隨機字符串

【1】設置Session

request.session['sign'] = 'user'

【2】取值session

sign = request.session.get('sign')

【3】session設置過期時間

            request.session['sign'] = 'user'# 如果是數字的話就是指定 s shu# request.session.set_expiry(3)# 0 就是關閉瀏覽器后自動清除瀏覽器的sessionidrequest.session.set_expiry(0)
  • 參數
    • 整數
      • 多少秒過期
    • 日期對象
      • 到指定日期失效
    • 0
      • 一旦退出當前瀏覽器窗口就失效
    • 不寫
      • 失效時間取決于Django內部全局session失效的時間

【4】刪除session

    # 刪除session方式一# request.session.delete()# 把瀏覽器和數據庫里面的session全部清除掉request.session.flush()
(1)request.session.delete():

只刪除服務端的

  • 該方法用于刪除當前用戶的Session數據,但會保留Session的Key。
  • 這意味著Session對象本身仍然存在,但其中的數據將被清空。
  • 下次訪問時,如果Session沒有被重新填充,則會得到一個空的Session對象。
(2)request.session.flush():

服務端和客戶端都刪除

  • 該方法用于完全刪除當前用戶的Session,包括Session對象和所有相關數據。
  • 下次訪問時,將創建一個新的空Session對象。

【5】注意

  • session基于數據庫表才能使用的

    • 必須先遷移數據庫,生成 django_session 表

  • session只對當次登錄有效

    • 主動清除瀏覽器中本地存在的session

    • 驗簽發現,沒有sessionid就會自動生成新的session

  • django_sessoin表中的數據條數取決于瀏覽器

  • 同一個計算機(IP地址)上同一個瀏覽器只會有一條數據生效

  • 同一個計算機(IP地址)上多個瀏覽器會有多個數據生效

  • 當session過期的時候,可能會出現多條數據對應一個瀏覽器

    • 但是這些數據不會持久化存儲,會被定時清理掉,可以手動清除也可以代碼清除

  • 目的是為了節省服務器數據庫資源

def login(request, *args, **kwargs):# next_url = request.get_full_path()# print(next_url) # /login/?next_url=/home/if request.method == 'POST':username = request.POST.get("username")password = request.POST.get("password")if username == "dream" and password == "521":# next_url = request.GET.get('next_url')# print(next_url) # /home/request.session['sign'] = 'user'obj = redirect('/home/')# 設置過期時間# obj.set_cookie('sign', 'user', expires=3)# obj.set_cookie('sign', 'user', max_age=3)return objelse:return redirect('/login/')return render(request, 'login.html')def login_auth(func):def inner(request, *args, **kwargs):# print(request.path_info) #  /home/# print(request.get_full_path()) # /home/?username=111next_url = request.get_full_path()  # /home/# print(next_url)# /home/sign = request.session.get('sign')# print(sign) # userif sign and sign == 'user':res = func(request, *args, **kwargs)return reselse:return redirect(f'/login/?next_url={next_url}')return inner@login_auth
def home(request, *args, **kwargs):return HttpResponse("這是home頁面")

【二】 CBV加裝飾器的三種方法

from django.utils.decorators import method_decorator
  • 方式一:加載視圖函數上面
    @method_decorator(login_auth)def get(self, request, *args, **kwargs):return HttpResponse("這是home頁面")def post(self):
  • 方式二:放在類視圖上面 (放的裝飾器函數,name指定你的視圖函數里面的方法)
# @method_decorator(login_auth, name='get')
# @method_decorator(login_auth, name='post')
class UserView(View):
  • 方式三 : dispactch 方法加裝飾器 : 本視圖函數內所有的視圖都需要走裝飾器
    @method_decorator(login_auth)def dispatch(self, request, *args, **kwargs):# Try to dispatch to the right method; if a method doesn't exist,# defer to the error handler. Also defer to the error handler if the# request method isn't on the approved list.if request.method.lower() in self.http_method_names:handler = getattr(self, request.method.lower(), self.http_method_not_allowed)else:handler = self.http_method_not_allowedreturn handler(request, *args, **kwargs)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160709.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160709.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160709.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

redis五種基本數據類型

redis存儲任何類型的數據都是以key-value形式保存,并且所有的key都是字符串,所以討論基礎數據結構都是基于value的數據類型 常見的5種數據類型是:String、List、Set、Zset、Hash 一) 字符串(String) String是redis最基本的類型,v…

linux日志不循環問題診斷

有一臺Linux虛擬機的messages日志文件自2023年7月下旬開始沒有按周為周期重新生成新的日志,一直累積在同一個messages文件中,如下所示: [root logrotate.d]# ls -l /var/log|grep me -rw-r--r-- 1 root root 107170 Nov 15 1…

地圖導航測試用例,你get了嗎?

地圖導航是我們經常使用的工具,能幫助我們指引前進的方向。 接下來,會從功能測試、UI測試、兼容測試、安全測試、網絡測試、性能測試、易用性測試、文檔和國際化語言測試8個方面來編寫地圖導航測試用例。 一 功能測試 輸入起點和終點,驗證…

python3.7升級為更高版本并遷移庫

創建虛擬環境 # 在進入當前的虛擬環境【py3.7的環境】使用pip導出全部包txt文件 pip freeze > all_package.txt# 創建虛擬環境 conda create -n py39 python3.9# 激活新創建的虛擬環境 conda activate py39# 用 pip 一鍵文件安裝 # pip install --help 查看-r命令的作用 # …

LeetCode48旋轉圖像

思路是沿對角線交換元素,之后沿矩陣中線交換元素 參考鏈接 🔗:【LeetCode 每日一題】48. 旋轉圖像 | 手寫圖解版思路 代碼講解-嗶哩嗶哩】 class Solution {public void rotate(int[][] matrix) {int i0,j0;if(matrixnull){return;}int n matrix.length;// int[]…

優先級隊列(priority_queue)

文章目錄 優先級隊列的定義定義:接口頭文件優先隊列和堆的關系使用:排序的規則容器 仿函數應用 隊列存指針問題: 優先級隊列的定義 定義: 黃色部分是仿函數 接口 頭文件 這里不需要包含其他的頭文件只需要使用隊列的頭文件就可以…

mysql 與 Oracle 的區別,oracle 與 mysql分頁查詢的區別

文章目錄 mysql 與 Oracle 的區別1、并發性2、一致性3、事務4、數據持久性5、提交方式6、邏輯備份7、熱備份8、sql語句的擴展和靈活性9、復制10、性能診斷11、權限與安全12、分區表和分區索引13、管理工具 oracle 與 mysql分頁查詢1.Oracle分頁查詢中提供了一個偽列&#xff1a…

LeetCode算法題解(動態規劃)|LeetCode343. 整數拆分、LeetCode96. 不同的二叉搜索樹

一、LeetCode343. 整數拆分 題目鏈接:343. 整數拆分 題目描述: 給定一個正整數 n ,將其拆分為 k 個 正整數 的和( k > 2 ),并使這些整數的乘積最大化。 返回 你可以獲得的最大乘積 。 示例 1: 輸入…

?極氪,中國傳統汽車品牌電動化的樣板間

這篇文章早就想寫了,因為太忙的原因就一直跳票,正好最近兩件事的出現,又觸發了想寫這篇文章的沖動。 兩件事主要是: 一,10 月份各家陸續公布了單月銷量以及累計銷量; 二,極氪在北京正式發布了 …

LeetCode100131. Make Three Strings Equal

文章目錄 一、題目二、題解 一、題目 You are given three strings s1, s2, and s3. You have to perform the following operation on these three strings as many times as you want. In one operation you can choose one of these three strings such that its length i…

PTA 7-2 簡單計算器

7-2 簡單計算器 分數 20 全屏瀏覽題目 作者 張彤彧 單位 浙江大學 模擬簡單運算器的工作。假設計算器只能進行加減乘除運算,運算數和結果都是整數,四種運算符的優先級相同,按從左到右的順序計算。 輸入格式: 輸入在一行中給出一個四則運…

【GUI】-- 10 貪吃蛇小游戲之靜態面板繪制

GUI編程 04 貪吃蛇小游戲 4.1 第一步:先繪制一個靜態的面板 首先,需要新建兩個類,一個StartGame類作為游戲的主啟動類;一個GamePanel類作為游戲的面板類。此外,再新建一個Data類作為數據中心(存放了小蛇各部分圖像的…

微信朋友圈全新玩法,輕松互動,引爆你的社交圈

隨著社交媒體的普及,越來越多的人開始利用朋友圈來展示自己的生活和與朋友互動。而在這個數字時代,定時發圈、跟圈和朋友圈互動已經成為了一種社交習慣。本文將介紹這些功能的概念和一鍵轉發朋友圈的實現方法。 什么是定時發圈、跟圈、朋友圈互動和一鍵轉…

Embedding技術與應用(4): Embedding應用工程探析

編者按:隨著互聯網內容數量的急劇增長,個性化推薦已成為各大科技公司的核心競爭力之一。那么,如何構建一個可靠、高效的基于嵌入技術的推薦系統,使其能夠在實際生產環境中正常運行呢?這是所有從業者都關心的問題。 本文…

git的實驗:cherry-pick,github對比代碼的兩種方式

某個commit,比如 c1,,最早是在a分支做的,當被cherry-pick到b分之后,還是一樣的revision嗎? 實驗1:c1被cherry-pick到別的分支后,revision不變對嗎?(答案是變…

druid keepAlive 導致數據庫連接數飆升

一.背景 應用在執行完某個復雜業務,主要包含20幾個查詢SQL的操作后,會導致數據庫連接池一直升高 druid版本:1.2.11 druid配置文件: spring.datasource.druid.maxActive100 spring.datasource.druid.initialSize20 spring.datas…

python解決登錄圖形驗證碼

摘要:測試過程中經常遇到圖片驗證碼,以下主要是調用百度OCR圖片識別獲取驗證碼,實現登錄 1、百度云申請創建應用

【自動駕駛】一些業內自動駕駛專業術語釋義

Trajectory 軌跡信息,一般都會發布未來5-10秒的trajactory信息。 Trajectory flicker 軌跡抖動 Nudge 道內避障。在維持車道不變的情況下,橫向偏離車道中心以繞開obstacle/agent。 Xlane Nudge 借道避障。借用對向車道或自行車道以繞開obstacle/a…

VMware Workstation 與 Device/Credential Guard 不兼容 解決辦法

問題描述 問題描述: VMware 啟動虛擬機會報錯。無法運行。 錯誤信息:VMware Workstation 與 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 原因分析: 通常原因是 Window 系統開啟了 內置的Hyper-V 虛擬機。 解決方案&…

氣死了,過五關,斬六將,結果被 HR 捅了一刀!!

Hello,大家好,我是 Sunday。 大家有沒有遇到過這樣的事情:“過五關,斬六將。通過了兩輪、甚至是三輪的技術面,最后 HR 面被“捅死”了” 這樣的事情,最近在一位同學身上連續出現了兩次,弄得人…