當咱們經過瀏覽器來訪問網站的時候,因爲HTTP自己是無狀態的,因此當咱們結束訪問後第二次再來訪問的時候,服務器自己是不認識咱們(它不知道咱們以前來過,也就不會保存咱們以前的信息),好比當咱們第一次登入的網站後第二次再來的時候咱們仍是須要從新登入,這樣網站不能保存咱們的密碼,是否是很麻煩,那如何解決這個問題呢?那cookie和session就是爲了解決這個問題而產生的。python
cookie:(1)咱們第一次訪問服務器的時候是 request直接請求過去,而後服務器會返回response和一個設置好的cookie值給瀏覽器,這個cookie直接保存在瀏覽器本地能夠設置過時時間,當咱們第二次訪問這個網站的時候咱們發送的服務器的不在是單純的request而是加上了一個cookie值(這個值是惟一的,服務器經過這個值來判斷這個訪問者是誰,有哪些記錄等),服務器根據這些值再發給瀏覽器信息。(圖左)數據庫
(2)cookie是保存在本地的一種存儲機制,大小不超過4Kbdjango
session:(1)咱們第一次訪問服務器的時候,服務器在產生一個session的文件保存在服務器數據庫中,這session文件中保存的就是這個客戶的一些信息包括一個session_id,用戶名,過時時間等等,而且是以加密的形式保存;而後服務器響應給瀏覽器的時候會把這個session_id發送給瀏覽器,當用戶下次訪問服務器的時候會把session_id一塊兒發送給服務器,服務器經過session_id去數據庫中查找該用戶的信息,解析這些信息後,返回給瀏覽器特定的頁面。瀏覽器
(2)session自己是一種思路,解決方案,不一樣的語言,框架設置session的方式不一樣;它是一種保存在服務器數據庫中的一種存儲方式;它是加密的。安全
Django中cookie的設置:服務器
設置cookie:cookie
response.set_cookie("key","value",max_age = 180,path="/cms/")session
key
:這個cookie
的key
。value
:這個cookie
的value
。max_age
:最長的生命週期。單位是秒。expires
:過時時間。跟max_age
是相似的,只不過這個參數須要傳遞一個具體的日期,好比datetime
或者是符合日期格式的字符串。若是同時設置了expires
和max_age
,那麼將會使用expires
的值做爲過時時間。path
:對域名下哪一個路徑有效。默認是對域名下全部路徑都有效。domain
:針對哪一個域名有效。默認是針對主域名下都有效,若是隻要針對某個子域名纔有效,那麼能夠設置這個屬性.secure
:是不是安全的,若是設置爲True
,那麼只能在https
協議下才可用。httponly
:默認是False
。若是爲True
,那麼在客戶端不能經過JavaScript
進行操做。獲取cookie:框架
經過request.COOKIES
來得到。這個對象是一個字典類型dom
刪除cookie:
經過delete_cookie("username")來刪除cookie,其實是把cookie的值設置爲空額字符串,而後把過時時間設置爲0;關閉瀏覽器天然就刪除了
cookie代碼實例
from django.http import HttpResponse from datetime import datetime from django.utils.timezone import make_aware def index(request): #設置cookie response = HttpResponse("ok") expires = datetime(year=2019,month=12,day=20,hour=0,minute=0,second=0) expires = make_aware(expires) response.set_cookie("username","abc",max_age=190,expires = expires,path="/cms/") return response def delete_cookie(request): #刪除cookie response = HttpResponse("delete") response.delete_cookie("username") return response def cookie_list(request): #獲取cookie cookies = request.COOKIES username = cookies.get("username") return HttpResponse(username)
django中session的設置:
session
經常使用的方法以下:
get
:用來從session
中獲取指定值。
pop
:從session
中刪除一個值。
keys
:從session
中獲取全部的鍵。
items
:從session
中獲取全部的值。
clear
:清除當前這個用戶的session
數據。 從瀏覽器中刪除,不會刪除數據庫的中
flush
:刪除session
而且刪除在瀏覽器中存儲的session_id
,通常在註銷的時候用得比較多。 直接刪除數據庫中的
set_expiry(value)
:設置過時時間。
session
配置。在settings.py
中能夠設置SESSION_COOKIE_AGE
來配置全局的過時時間。默認是1209600
秒,也就是2周的時間clear_expired
:清除過時的session
。Django
並不會清除過時的session
,須要按期手動的清理,或者是在終端,使用命令行python manage.py clearsessions
來清除過時的session
。
from datetime import timedelta def session_list(request): # request.session["username"] = "username" #添加session # username = request.session.get('username') #獲取session # print(username)
request.session.clear() #刪除session_id 不會刪除數據庫中的數據
request.session.flush() #暴力刪除數據庫中的數據一塊兒刪除
request.session.clear_expired() #清除過時的session expiry = timedelta(days=2) request.session.set_expiry(None) return HttpResponse("ok")