您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)cookie和session如何在django框架中應(yīng)用,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
首先知道http協(xié)議
http協(xié)議它是無(wú)狀態(tài)的協(xié)議,驗(yàn)證的信息不會(huì)保留
基于請(qǐng)求響應(yīng),短連接
cookie
指一段小信息,內(nèi)部是一組組的鍵值對(duì),保存在客戶端
訪問(wèn)一個(gè)地址時(shí),服務(wù)器生成一個(gè)cookie,由瀏覽器保留在本地,再次訪問(wèn)地址時(shí)就會(huì)攜帶這個(gè)cookie,一般用于用戶信息的驗(yàn)證
cookie的設(shè)置:
obj.set_cookie(key,value,...)
下面來(lái)看一個(gè)簡(jiǎn)單的例子
#設(shè)置cookie def login(request): if request.method=="POST": user=request.POST.get("user") pwd=request.POST.get("pwd") user=UserInfo.objects.filter(user=user,pwd=pwd).first() if user: obj=HttpResponse("登陸成功") obj.set_cookie("is_login",True) return obj return render(request,"login.html") #獲取cookie并進(jìn)行判斷 def index(request): ret=request.COOKIES.get("is_login") if not ret: return redirect("/login/") return render(request,"index.html")
其他參數(shù)
參數(shù):
key, 鍵
value='', 值
max_age=None, 超時(shí)時(shí)間
expires=None, 超時(shí)時(shí)間(IE requires expires, so set it if hasn't been already.)
path='/', Cookie生效的路徑,/ 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁(yè)面訪問(wèn)
domain=None, Cookie生效的域名
secure=False, https傳輸
httponly=True 只能http協(xié)議傳輸,無(wú)法被JavaScript獲?。ú皇墙^對(duì),底層抓包可以獲取到也可以被覆蓋)
cookie的刪除
obj.delete_cookie("is_login")
下面來(lái)看一個(gè)登陸和注銷頁(yè)面
def books(request): is_login=request.COOKIES.get("is_login") if not is_login: return_url=request.path_info #判斷是否有cookies沒(méi)有則記錄到return_url if return_url: return redirect("{}?return_url={}".format("/login/",return_url)) #將return_url加到路徑后面返回到login頁(yè)面,等到用戶驗(yàn)證登陸后直接跳轉(zhuǎn)到這個(gè)頁(yè)面 book_list=Book.objects.all() return render(request,"books.html",locals()) def login(request): error_msg='' if request.method=="POST": user=request.POST.get("user") pwd=request.POST.get("pwd") user_au=UserInfo.objects.filter(user=user,pwd=pwd).first() #從數(shù)據(jù)庫(kù)中驗(yàn)證用戶 if user_au: return_url=request.GET.get('return_url') if return_url: #判斷是否有return_url ret=redirect(return_url) else: ret=HttpResponse("進(jìn)入其他頁(yè)面") ret.set_cookie("is_login",True) #驗(yàn)證成功則設(shè)置cookies return ret error_msg="用戶名或者密碼錯(cuò)誤" return render(request,"login.html",locals()) def logout(request): ret=redirect("/login/") ret.delete_cookie('is_login') return ret
驗(yàn)證第一種情況
---------------------------》》》》》
#####################################################################################################################################################################################
驗(yàn)證第二種情況
----------》》》》》------》》》
session
由于cookies保存在客戶端上面,存在不安全因素,并且有長(zhǎng)度限制---4096
進(jìn)而引入了session
session的用法
# 獲取、設(shè)置、刪除Session中數(shù)據(jù) request.session['k1'] #獲取 request.session.get('k1',None) #獲取 request.session['k1'] = 123 #設(shè)置 request.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() # 會(huì)話session的key request.session.session_key # 將所有Session失效日期小于當(dāng)前日期的數(shù)據(jù)刪除 request.session.clear_expired() # 檢查會(huì)話session的key在數(shù)據(jù)庫(kù)中是否存在 request.session.exists("session_key") # 刪除當(dāng)前會(huì)話的所有Session數(shù)據(jù) request.session.delete() #刪除reponse sessionid,用戶已經(jīng)訪問(wèn)不了了,但是可以看到 request sessionid # 刪除當(dāng)前的會(huì)話數(shù)據(jù)并刪除會(huì)話的Cookie。 request.session.flush() # reponse 和 request sessionid都看不到 這用于確保前面的會(huì)話數(shù)據(jù)不可以再次被用戶的瀏覽器訪問(wèn) 例如,django.contrib.auth.logout() 函數(shù)中就會(huì)調(diào)用它。 # 設(shè)置會(huì)話Session和Cookie的超時(shí)時(shí)間 request.session.set_expiry(value) * 如果value是個(gè)整數(shù),session會(huì)在些秒數(shù)后失效。 * 如果value是個(gè)datatime或timedelta,session就會(huì)在這個(gè)時(shí)間后失效。 * 如果value是0,用戶關(guān)閉瀏覽器session就會(huì)失效。 * 如果value是None,session會(huì)依賴全局session失效策略。
下面來(lái)看一個(gè)例子
def books(request): # is_login=request.COOKIES.get("is_login") is_login=request.session.get("is_login") if not is_login: return_url=request.path_info if return_url: return redirect("{}?return_url={}".format("/login/",return_url)) book_list=Book.objects.all() return render(request,"books.html",locals()) def login(request): error_msg='' if request.method=="POST": user=request.POST.get("user") pwd=request.POST.get("pwd") user_au=UserInfo.objects.filter(user=user,pwd=pwd).first() if user_au: return_url=request.GET.get('return_url') if return_url: ret=redirect(return_url) else: ret=HttpResponse("進(jìn)入其他頁(yè)面") # ret.set_cookie("is_login",True) request.session['is_login']=True return ret error_msg="用戶名或者密碼錯(cuò)誤" return render(request,"login.html",locals()) def logout(request): ret=redirect("/login/") # ret.delete_cookie('is_login') request.session.delete() #刪除Reponse sessionID # request.session.flush() #刪除Reponse sessionID和Request sessionID return ret
設(shè)置了session之后,數(shù)據(jù)庫(kù)會(huì)自動(dòng)生成一個(gè)表,表名:django_session
我們來(lái)查看session的默認(rèn)設(shè)置
from django.conf import settings,global_settings 通過(guò) global_settings查看到下面信息 ############ # SESSIONS # ############ # Cache to store session data if using the cache session backend. SESSION_CACHE_ALIAS = 'default' # Cookie name. This can be whatever you want. SESSION_COOKIE_NAME = 'sessionid' # Age of cookie, in seconds (default: 2 weeks). SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 # A string like ".example.com", or None for standard domain cookie. SESSION_COOKIE_DOMAIN = None # Whether the session cookie should be secure (https:// only). SESSION_COOKIE_SECURE = False # The path of the session cookie. SESSION_COOKIE_PATH = '/' # Whether to use the non-RFC standard httpOnly flag (IE, FF3+, others) SESSION_COOKIE_HTTPONLY = True # Whether to save the session data on every request. SESSION_SAVE_EVERY_REQUEST = False # Whether a user's session cookie expires when the Web browser is closed. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # The module to store session data SESSION_ENGINE = 'django.contrib.sessions.backends.db' # Directory to store session files if using the file session module. If None, # the backend will use a sensible default. SESSION_FILE_PATH = None # class to serialize session data SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
1. 數(shù)據(jù)庫(kù)Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認(rèn))
2. 緩存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認(rèn)內(nèi)存緩存,也可以是memcache),此處別名依賴緩存的設(shè)置
3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個(gè)臨時(shí)地址tempfile.gettempdir()
4. 緩存+數(shù)據(jù)庫(kù)
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
其他公用設(shè)置項(xiàng):
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))
關(guān)于cookie和session如何在django框架中應(yīng)用就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。