django進階之cookie和session的使用示例
Cookies :是瀏覽器為 Web 服務(wù)器存儲的一小段信息。 每次瀏覽器從某個服務(wù)器請求頁面時,它收到服務(wù)器回發(fā)送過來的cookies。它保存在瀏覽器下的某個文件夾下。
Session:Django的Session機制會向請求的瀏覽器發(fā)送cookie字符串。同時也會保存到本地一份,用來驗證瀏覽器登錄是否為同一用戶。它存在于服務(wù)器,Django默認會把session存入到數(shù)據(jù)庫中。
Session依賴于Cookie,如果瀏覽器不能保存cookies那么session就失效了。因為它需要瀏覽器的cookie值(sessionid)去session里做對比。session就是用來在服務(wù)器端保存用戶的會話狀態(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ù):
- default: 默認值
- salt: 加密鹽
- max_age: 后臺控制過期時間
2、設(shè)置Cookie:
rep = HttpResponse(...) 或 rep = render(request, ...) rep.set_cookie(key,value,...) # 給cookie簽名 rep.set_signed_cookie(key,value,salt='加密鹽',...)
參數(shù):
- key, 鍵
- value='', 值
- max_age=None, 超時時間
- expires=None, 超時時間(IE requires expires, so set it if hasn't been already.)
- path='/', Cookie生效的路徑,/ 表示根路徑,特殊的:跟路徑的cookie可以被任何url的頁面訪問
- domain=None, Cookie生效的域名
- secure=False, https傳輸
- httponly=False True只能http協(xié)議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋),防止xss攻擊
由于cookie保存在客戶端的電腦上,所以,JavaScript和jquery也可以操作cookie。
<script src='/static/js/jquery.cookie.js'></script>
$.cookie("list_pager_num", 30,{ path: '/' });
Session
Django中默認支持Session,其內(nèi)部提供了5種類型的Session供開發(fā)者使用:
數(shù)據(jù)庫(默認)
緩存
文件
緩存+數(shù)據(jù)庫
加密cookie
1、數(shù)據(jù)庫Session
Django默認支持Session,并且默認是將Session數(shù)據(jù)存儲在數(shù)據(jù)庫中,即:django_session 表中。
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認) SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默認) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關(guān)閉瀏覽器使得Session過期(默認) SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改之后才保存(默認)
b. 使用
def index(request):
# 獲取、設(shè)置、刪除Session中數(shù)據(jù)
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在則不設(shè)置
del request.session['k1']
# 所有 鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 用戶session的隨機字符串
request.session.session_key
# 將所有Session失效日期小于當前日期的數(shù)據(jù)刪除
request.session.clear_expired()
# 檢查 用戶session的隨機字符串 在數(shù)據(jù)庫中是否
request.session.exists("session_key")
# 刪除當前用戶的所有Session數(shù)據(jù)
request.session.delete("session_key")
2、緩存Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認內(nèi)存緩存,也可以是memcache),此處別名依賴緩存的設(shè)置 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關(guān)閉瀏覽器使得Session過期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改之后才保存
b. 使用
同上
3、文件Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關(guān)閉瀏覽器使得Session過期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改之后才保存
b. 使用
同上
4、緩存+數(shù)據(jù)庫Session
數(shù)據(jù)庫用于做持久化,緩存用于提高效率
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 datetime
def login(request):
print("COOKIES",request.COOKIES) #打印cookies 一個字典,里面多個鍵值對
print("SESSION",request.session) #session為服務(wù)器對應(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/")
# 給對象ret設(shè)置cookie 安全性較差 ,設(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ù)對應(yīng)的鍵,
request.session["is_login"]=True # 在session中增加鍵值對
request.session["user"]=name
return redirect("/index/")
return render(request,"login.html")
def index(request):
if request.COOKIES.get("username",None): # 取不到設(shè)置默認值為None
name = request.COOKIES.get("username",None)
return render(request, "index.html", locals())
# session驗證 存在數(shù)據(jù)庫中,所以要先makemigrations生成數(shù)據(jù)庫
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")
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
回調(diào)函數(shù)的意義以及python實現(xiàn)實例
本篇文章主要介紹了回調(diào)函數(shù)的意義以及python實現(xiàn)實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
Python3.4學習筆記之 idle 清屏擴展插件用法分析
這篇文章主要介紹了Python3.4 idle 清屏擴展插件用法,簡單分析了idle清屏的幾種方法及idle清屏插件的相關(guān)使用技巧,需要的朋友可以參考下2019-03-03
python3 deque 雙向隊列創(chuàng)建與使用方法分析
這篇文章主要介紹了python3 deque 雙向隊列創(chuàng)建與使用方法,結(jié)合實例形式分析了python3 deque 雙向隊列創(chuàng)建、添加、清空、拷貝等相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下2020-03-03

