Cookies :是瀏覽器為 Web 服務(wù)器存儲(chǔ)的一小段信息。 每次瀏覽器從某個(gè)服務(wù)器請(qǐng)求頁(yè)面時(shí),它收到服務(wù)器回發(fā)送過(guò)來(lái)的cookies。它保存在瀏覽器下的某個(gè)文件夾下。
Session:Django的Session機(jī)制會(huì)向請(qǐng)求的瀏覽器發(fā)送cookie字符串。同時(shí)也會(huì)保存到本地一份,用來(lái)驗(yàn)證瀏覽器登錄是否為同一用戶。它存在于服務(wù)器,Django默認(rèn)會(huì)把session存入到數(shù)據(jù)庫(kù)中。
Session依賴于Cookie,如果瀏覽器不能保存cookies那么session就失效了。因?yàn)樗枰獮g覽器的cookie值(sessionid)去session里做對(duì)比。session就是用來(lái)在服務(wù)器端保存用戶的會(huì)話狀態(tài)。
Cookie
1、獲取Cookie:
request.COOKIES[key]request.COOKIES.get(key)# 普通cookie是明文傳輸?shù)模梢灾苯釉诳蛻舳酥苯哟蜷_,所以需要加鹽,解鹽之后才能查看request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
參數(shù):
2、設(shè)置Cookie:
rep = HttpResponse(...) 或 rep = render(request, ...)rep.set_cookie(key,value,...)# 給cookie簽名rep.set_signed_cookie(key,value,salt='加密鹽',...)
參數(shù):
由于cookie保存在客戶端的電腦上,所以,JavaScript和jquery也可以操作cookie。
<script src='/static/js/jquery.cookie.js'></script>$.cookie("list_pager_num", 30,{ path: '/' });Session
Django中默認(rèn)支持Session,其內(nèi)部提供了5種類型的Session供開發(fā)者使用:
數(shù)據(jù)庫(kù)(默認(rèn))
緩存
文件
緩存+數(shù)據(jù)庫(kù)
加密cookie
1、數(shù)據(jù)庫(kù)Session
Django默認(rèn)支持Session,并且默認(rèn)是將Session數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,即:django_session 表中。
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認(rèn))SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時(shí)的key,即:sessionid=隨機(jī)字符串(默認(rèn))SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認(rèn))SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認(rèn))SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認(rèn))SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認(rèn))SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默認(rèn))SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關(guān)閉瀏覽器使得Session過(guò)期(默認(rèn))SESSION_SAVE_EVERY_REQUEST = False # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存(默認(rèn))
b. 使用
def index(request):# 獲取、設(shè)置、刪除Session中數(shù)據(jù)request.session['k1']request.session.get('k1',None)request.session['k1'] = 123request.session.setdefault('k1',123) # 存在則不設(shè)置del request.session['k1']# 所有 鍵、值、鍵值對(duì)request.session.keys()request.session.values()request.session.items()request.session.iterkeys()request.session.itervalues()request.session.iteritems()# 用戶session的隨機(jī)字符串request.session.session_key# 將所有Session失效日期小于當(dāng)前日期的數(shù)據(jù)刪除request.session.clear_expired()# 檢查 用戶session的隨機(jī)字符串 在數(shù)據(jù)庫(kù)中是否request.session.exists("session_key")# 刪除當(dāng)前用戶的所有Session數(shù)據(jù)request.session.delete("session_key")2、緩存Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認(rèn)內(nèi)存緩存,也可以是memcache),此處別名依賴緩存的設(shè)置SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時(shí)的key,即:sessionid=隨機(jī)字符串SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名SESSION_COOKIE_SECURE = False # 是否Https傳輸cookieSESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關(guān)閉瀏覽器使得Session過(guò)期SESSION_SAVE_EVERY_REQUEST = False # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存
b. 使用
同上
3、文件Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個(gè)臨時(shí)地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/TSESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時(shí)的key,即:sessionid=隨機(jī)字符串SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名SESSION_COOKIE_SECURE = False # 是否Https傳輸cookieSESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關(guān)閉瀏覽器使得Session過(guò)期SESSION_SAVE_EVERY_REQUEST = False # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存
b. 使用
同上
4、緩存+數(shù)據(jù)庫(kù)Session
數(shù)據(jù)庫(kù)用于做持久化,緩存用于提高效率
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
b. 使用
同上
5、加密cookie Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
b. 使用
同上
示例:
from django.shortcuts import render,redirect# Create your views here.import datetimedef login(request): print("COOKIES",request.COOKIES) #打印cookies 一個(gè)字典,里面多個(gè)鍵值對(duì) print("SESSION",request.session) #session為服務(wù)器對(duì)應(yīng)客戶信息的鍵 if request.method=="POST": name=request.POST.get("user") pwd=request.POST.get("pwd") if name=="yuan" and pwd=="123": # ret=redirect("/index/") # 給對(duì)象ret設(shè)置cookie 安全性較差 ,設(shè)定有效時(shí)間max_age,expires, # ret.set_cookie("username",{"11":"22"},max_age=10,expires=datetime.datetime.utcnow()+datetime.timedelta(days=3)) # return ret # COOKIE SESSION一起使用 # session 以字典存放在服務(wù)器端,發(fā)給客戶端的是數(shù)據(jù)對(duì)應(yīng)的鍵, request.session["is_login"]=True # 在session中增加鍵值對(duì) request.session["user"]=name return redirect("/index/") return render(request,"login.html")def index(request): if request.COOKIES.get("username",None): # 取不到設(shè)置默認(rèn)值為None name = request.COOKIES.get("username",None) return render(request, "index.html", locals()) # session驗(yàn)證 存在數(shù)據(jù)庫(kù)中,所以要先makemigrations生成數(shù)據(jù)庫(kù) if request.session.get("is_login",None): name=request.session.get("user",None) return render(request,"index.html",locals()) else: return redirect("/login/")##session獲取request.session.get("user",None)# 設(shè)置request.session["user"]=name# 刪除del request.session.get("user")以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選