目 錄
-
Django中cookie、session的由來
-
cookie相關操作
-
session相關操作
一、Django中Cookie、session的由來
1、Cookie的由來
Cookie 的由來源於Http協議四大特性之一:無狀態!
狀態就是客戶端和服務端在一次會話中所產生的數據,無狀態就是說這些數據不會保存下來,每一次的連接都是獨立的不會受前一連接的影響也不會影響下一次連接。
但是如果我們需要“保存狀態”的時候,就用到了Cookie!
Cookie的定義
Cookie具體是指一小段信息,它由服務器產生,存儲在瀏覽器上的一組組的鍵值對(本質)
當瀏覽器訪問服務器的時候會自動帶上這些鍵值對,服務器通過Cookie來提取有用的信息!
Cookie的原理
當瀏覽器訪問服務端的時候,服務端會產生內容(一個獨一無二的字符串),瀏覽器將其保存在本地,當瀏覽器再次訪問服務端的時候會自動帶上cookie,服務器通過Cookie就判斷出是該瀏覽器是誰了!!!
2、session的由來
客戶端中保存的Cookie解決了Http協議的‘無狀態’問題,現在我們可以在Cookie中“保存狀態”!我們為每一個客戶端的cookie分配一個唯一的id,我們通過id來判斷每個瀏覽器是誰!
但是客戶端中的Cookie只能以文本的形式存儲,最大內容4096字節的文件,而且存儲在客戶端中容易被攔截自身安全性較差!這樣我們就需要一種新的東西,既可以支持更多的字節,又可以保存在服務端有
較高的安全性,這就是session!
總結:
我們通過cookie中的id來判斷訪問的瀏覽器是誰,在根據id為其保存一段時間的私密信息,如‘賬號密碼’等,這些信息就是保存在session上!
二、cookie相關操作
Cookies 本質上就是由服務端產生的保存在客戶端瀏覽器上的一組組鍵值對!!!
是服務端設置在客戶端瀏覽器上的鍵值對 也就意味着瀏覽器其實可以拒絕服務端的"命令" 默認情況下 瀏覽器都是直接讓服務端設置鍵值對 django必會三板斧 return HttpResponse() return render() return redirect() 變形: obj1 = HttpResponse() return obj1 obj2 = render() return obj2 obj3 = redirect() return obj3
注意:
無論是HttpResponse()、render()、 redirect() 本質上都是Httpresponse()對象!!!
Cookie相關操作
設置cookie
obj1.set_cookie()
獲取
request.COOKIES.get()
刪除
obj1.delete_cookie()
案例:
登錄功能,Cookie版登錄校驗
代碼如下:(待核驗)

from django.shortcuts import render,HttpResponse,redirect # Create your views here. def login(request): # print(request.path_info) # 只拿url 不拿get請求攜帶的額參數 # print(request.get_full_path()) # 都拿 if request.method == "POST": username = request.POST.get('username') password = request.POST.get('password') if username == 'jason' and password == '123': old_path = request.GET.get('next') if old_path: # 保存用戶登錄狀態 obj = redirect(old_path) else: obj = redirect('/home/') obj.set_cookie('name','jason') # 讓客戶端瀏覽器 記錄一個鍵值對 # obj.set_cookie('name','jason',max_age=5) # 讓客戶端瀏覽器 記錄一個鍵值對 return obj return render(request,'login.html') from functools import wraps def login_auth(func): @wraps(func) def inner(request,*args,**kwargs): if request.COOKIES.get('name'): res = func(request,*args,**kwargs) return res else: target_url = request.path_info return redirect('/login/?next=%s'%target_url) return inner @login_auth def home(request): # 校驗用戶是否登錄 # if request.COOKIES.get('name'): # return HttpResponse('我是主頁 只有登錄了才能看') # return redirect('/login/') return HttpResponse('我是主頁 只有登錄了才能看') @login_auth def index(request): return HttpResponse('我是index頁面 也需要用戶登錄之后才能看') @login_auth def xxx(request): return HttpResponse('xxx頁面 也是需要登錄了之后才能看') @login_auth def logout(request): obj = redirect('/login/') obj.delete_cookie('name') return obj

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script> </head> <body> <form action="" method="post"> <p>username:<input type="text" name="username"></p> <p>password:<input type="text" name="password"></p> <input type="submit"> </form> </body> </html>
三、session相關操作
session
session
session是保存在服務器上的鍵值對
django session默認的過期時間是14天
session相關操作及原理
操作session 設置session request.session['key'] = value # 僅僅只會在內存產生一個緩存 """ 1.django內部自動生成了隨機的字符串 2.在django_session表中存入數據 session_key session_data date 隨機字符串1 數據1 ... 隨機字符串2 數據2 ... 隨機字符串3 數據3 ... 3.將產生的隨機字符串發送給瀏覽器 讓瀏覽器保存到cookie中 sessionid:隨機字符串 """ 獲取session request.session.get('key') """ 1.瀏覽器發送cookie到django后端之后 django會自動獲取到cookie值 2.拿着隨機字符串去django_session表中比對 是否有對應的數據 3.如果比對上了 就講隨機字符串所對應的數據 取出賦值給request.session 如果對不上 那么request.session就是個空 """
注意:
session中保存的相關私密信息都存儲在django_session表中,
django session表是針對瀏覽器的
不同的瀏覽器來 才會有不同的記錄
session刪除操作:
刪除session request.session.delete() # 只刪除服務端的session request.session.flush() # 瀏覽器和服務端全部刪除 session也可以設置超時時間 request.session.set_expiry(value多種配置) 數字 0 不寫 時間格式
Django中更多的操作:

# 獲取、設置、刪除Session中數據 request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在則不設置 del request.session['k1'] # 所有 鍵、值、鍵值對 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 會話session的key request.session.session_key # 將所有Session失效日期小於當前日期的數據刪除 request.session.clear_expired() # 檢查會話session的key在數據庫中是否存在 request.session.exists("session_key") # 刪除當前會話的所有Session數據 request.session.delete() # 刪除當前的會話數據並刪除會話的Cookie。 request.session.flush() 這用於確保前面的會話數據不可以再次被用戶的瀏覽器訪問 例如,django.contrib.auth.logout() 函數中就會調用它。 # 設置會話Session和Cookie的超時時間 request.session.set_expiry(value) * 如果value是個整數,session會在些秒數后失效。 * 如果value是個datatime或timedelta,session就會在這個時間后失效。 * 如果value是0,用戶關閉瀏覽器session就會失效。 * 如果value是None,session會依賴全局session失效策略
案例:
session版登錄校驗
代碼如下:

from functools import wraps def check_login(func): @wraps(func) def inner(request, *args, **kwargs): next_url = request.get_full_path() if request.session.get("user"): return func(request, *args, **kwargs) else: return redirect("/login/?next={}".format(next_url)) return inner def login(request): if request.method == "POST": user = request.POST.get("user") pwd = request.POST.get("pwd") if user == "alex" and pwd == "alex1234": # 設置session request.session["user"] = user # 獲取跳到登陸頁面之前的URL next_url = request.GET.get("next") # 如果有,就跳轉回登陸之前的URL if next_url: return redirect(next_url) # 否則默認跳轉到index頁面 else: return redirect("/index/") return render(request, "login.html") @check_login def logout(request): # 刪除所有當前請求相關的session request.session.delete() return redirect("/login/") @check_login def index(request): current_user = request.session.get("user", None) return render(request, "index.html", {"user": current_user})