Cookies :是瀏覽器爲 Web 服務器存儲的一小段信息。 每次瀏覽器從某個服務器請求頁面時,它收到服務器回發送過來的cookies。它保存在瀏覽器下的某個文件夾下。
Session:Django的Session機制會向請求的瀏覽器發送cookie字符串。同時也會保存到本地一份,用來驗證瀏覽器登陸是否爲同一用戶。它存在於服務器,Django默認會把session存入到數據庫中。html
Session依賴於Cookie,若是瀏覽器不能保存cookies那麼session就失效了。由於它須要瀏覽器的cookie值(sessionid)去session裏作對比。session就是用來在服務器端保存用戶的會話狀態。python
一、獲取Cookie:jquery
request.COOKIES[key] request.COOKIES.get(key) # 普通cookie是明文傳輸的,能夠直接在客戶端直接打開,因此須要加鹽,解鹽以後才能查看 request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) 參數: default: 默認值 salt: 加密鹽 max_age: 後臺控制過時時間
二、設置Cookie:數據庫
rep = HttpResponse(...) 或 rep = render(request, ...) rep.set_cookie(key,value,...) # 給cookie簽名 rep.set_signed_cookie(key,value,salt='加密鹽',...) 參數: 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協議傳輸,沒法被JavaScript獲取(不是絕對,底層抓包能夠獲取到也能夠被覆蓋),防止xss攻擊
因爲cookie保存在客戶端的電腦上,因此,JavaScript和jquery也能夠操做cookie。django
<script src='/static/js/jquery.cookie.js'></script> $.cookie("list_pager_num", 30,{ path: '/' });
Django中默認支持Session,其內部提供了5種類型的Session供開發者使用:瀏覽器
數據庫(默認)
緩存
文件
緩存+數據庫
加密cookie緩存
Django默認支持Session,而且默認是將Session數據存儲在數據庫中,即: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 # 是否關閉瀏覽器使得Session過時(默認) SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改以後才保存(默認) b. 使用 def index(request): # 獲取、設置、刪除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的隨機字符串 request.session.session_key # 將全部Session失效日期小於當前日期的數據刪除 request.session.clear_expired() # 檢查 用戶session的隨機字符串 在數據庫中是否 request.session.exists("session_key") # 刪除當前用戶的全部Session數據 request.session.delete("session_key")
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認內存緩存,也能夠是memcache),此處別名依賴緩存的設置 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 # 是否關閉瀏覽器使得Session過時 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改以後才保存 b. 使用 同上
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 # 是否關閉瀏覽器使得Session過時 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改以後才保存 b. 使用 同上
數據庫用於作持久化,緩存用於提升效率 a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 b. 使用 同上
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爲服務器對應客戶信息的鍵 if request.method=="POST": name=request.POST.get("user") pwd=request.POST.get("pwd") if name=="yuan" and pwd=="123": # ret=redirect("/index/") # 給對象ret設置cookie 安全性較差 ,設定有效時間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 以字典存放在服務器端,發給客戶端的是數據對應的鍵, 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): # 取不到設置默認值爲None name = request.COOKIES.get("username",None) return render(request, "index.html", locals()) # session驗證 存在數據庫中,因此要先makemigrations生成數據庫 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) # 設置 request.session["user"]=name # 刪除 del request.session.get("user")