這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)cookie和session如何在Django框架中使用,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)公司長(zhǎng)期為近1000家客戶(hù)提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為曲陽(yáng)企業(yè)提供專(zhuān)業(yè)的網(wǎng)站制作、成都做網(wǎng)站,曲陽(yáng)網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。part 1 概念
在Django里面,cookie和session都記錄了客戶(hù)端的某種狀態(tài),用來(lái)跟蹤用戶(hù)訪問(wèn)網(wǎng)站的整個(gè)回話。
兩者大的區(qū)別是cookie的信息是存放在瀏覽器客戶(hù)端的,而session是存放在服務(wù)器端的。
兩者使用的方式都是request.COOKIES[XXX]
和request.session[XXX]
,其中XXX是您想要取得的東西的key。
Cookie——保存在客戶(hù)端瀏覽器上的鍵值對(duì)
只要是HTTP協(xié)議,就會(huì)有COOKIE這個(gè)東西; 只要您的瀏覽器沒(méi)有禁用Cookie,就可是使用它。而且是不分用什么語(yǔ)言,用什么框架,因?yàn)檫@是在HTTP協(xié)議的層面支持的,瀏覽器會(huì)把您設(shè)置的XXX的這個(gè)Cookie在Response之后保存到您的本地機(jī)器,在下次您向服務(wù)器提交或者瀏覽的時(shí)候會(huì)把上次保存下來(lái)的COOKIE帶上發(fā)送向服務(wù)器;說(shuō)到這里我們應(yīng)該澄清一個(gè)概念,就是BS結(jié)構(gòu)理論上是沒(méi)有同步的服務(wù)器-客戶(hù)端的狀態(tài)維持的,所以Cookie本質(zhì)上就是一種異步的狀態(tài)維護(hù),所有這一切瀏覽器都幫我們搞定了,所以不用關(guān)心。 當(dāng)然如果使用是Django的話,最終的HttpRequest也許是WSGIRequest(調(diào)試的時(shí)候使用WSGI方式),也許是ModPythonRequest(使用Apache+Mod_python的方式),他們都是一個(gè)HTTP協(xié)議要求的Requset的實(shí)現(xiàn);
Session是保存在服務(wù)器端的鍵值對(duì),session內(nèi)部機(jī)制依賴(lài)于cookie
我們都知道Django可以通過(guò)meddleware來(lái)修改requset和response,如果想使用Django當(dāng)中Session,
首先必須要求您的Django工程的settiongs.py文件里面的MIDDLEWARE_CLASSES設(shè)置里面已經(jīng)包含有django.contrib.sessions.middleware.SessionMiddleware
(其實(shí)默認(rèn)就是有的)。
接下來(lái)我們看看/django/contrib/sessions/middleware.py這個(gè)文件,里面定義了一個(gè)SessionMiddleware的class,
其中的process_request函數(shù)有一句話:
session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
我們所使用的request.session
當(dāng)中的sesson這個(gè)變量就是在這一刻誕生的
這個(gè)類(lèi)是根據(jù)得到COOKIES里面的settings.SESSION_COOKIE_NAME
來(lái)生成
如果瀏覽器不支持Cookie的話,Django的Session也就無(wú)從用起了,因?yàn)镾ession的生成是根據(jù)Cookie里面記錄的SESSION_COOKIE_NAME來(lái)生成的
part 2 cookie
1,views視圖函數(shù)
user_info = { 'user1': {'pwd': "123123"}, 'user2': {'pwd': "kkkkkkk"}, } def login(request): if request.method == "GET": return render(request,'login.html') if request.method == "POST": u = request.POST.get('username') p = request.POST.get('pwd') dic = user_info.get(u) if not dic: return render(request,'login.html') if dic['pwd'] == p: res = redirect('/index/') # res.set_cookie('user1',u,max_age=10) # import datetime # current_date = datetime.datetime.utcnow() # current_date = current_date + datetime.timedelta(seconds=5) # res.set_cookie('user1',u,expires=current_date) res.set_cookie('user1',u) res.set_cookie('user_type',"asdfjalskdjf",httponly=True) return res else: return render(request,'login.html') def auth(func): def inner(reqeust,*args,**kwargs): v = reqeust.COOKIES.get('user1') if not v: return redirect('/login/') return func(reqeust, *args,**kwargs) return inner @auth def index(reqeust): # 獲取當(dāng)前已經(jīng)登錄的用戶(hù) v = reqeust.COOKIES.get('user1') return render(reqeust,'index.html',{'current_user': v}) from django import views from django.utils.decorators import method_decorator @method_decorator(auth,name='dispatch') class Order(views.View): # @method_decorator(auth) # def dispatch(self, request, *args, **kwargs): # return super(Order,self).dispatch(request, *args, **kwargs) # @method_decorator(auth) def get(self,reqeust): v = reqeust.COOKIES.get('user1') return render(reqeust,'index.html',{'current_user': v}) def post(self,reqeust): v = reqeust.COOKIES.get('user1') return render(reqeust,'index.html',{'current_user': v}) def order(reqeust): # 獲取當(dāng)前已經(jīng)登錄的用戶(hù) v = reqeust.COOKIES.get('user1') return render(reqeust,'index.html',{'current_user': v}) def cookie(request): # request.COOKIES # request.COOKIES['user1'] request.COOKIES.get('user1') response = render(request,'index.html') response = redirect('/index/') # 設(shè)置cookie,關(guān)閉瀏覽器失效 response.set_cookie('key',"value") # 設(shè)置cookie, N秒只有失效 response.set_cookie('user1',"value",max_age=10) # 設(shè)置cookie, 截止時(shí)間失效 import datetime current_date = datetime.datetime.utcnow() current_date = current_date + datetime.timedelta(seconds=5) response.set_cookie('user1',"value",expires=current_date) response.set_cookie('user1',"value",max_age=10) # request.COOKIES.get('...') # response.set_cookie(...) obj = HttpResponse('s') obj.set_signed_cookie('username',"kangbazi",salt="asdfasdf") request.get_signed_cookie('username',salt="asdfasdf") return response
代碼詳解:
1.1 login函數(shù)渲染登錄頁(yè)面,同時(shí)設(shè)置cookie
1.2 裝飾器
FBV(function base views) 就是在視圖里使用函數(shù)處理請(qǐng)求。
auth裝飾器相當(dāng)于下面的index函數(shù)
def index(reqeust): # 獲取當(dāng)前已經(jīng)登錄的用戶(hù) v = reqeust.COOKIES.get('user1') if not v: return redirect('/login/') return render(reqeust,'index.html',{'current_user': v})
CBV(class base views) 就是在視圖里使用類(lèi)處理請(qǐng)求。
@method_decorator(auth,name='dispatch')#寫(xiě)在這里表示對(duì)dispatch裝飾 class Order(views.View): # @method_decorator(auth) #寫(xiě)在這里,規(guī)則要通過(guò)dispatch,dispatch不符合就下面也用不上 #dispath方法在執(zhí)行下面方法之前執(zhí)行 def dispatch(self, request, *args, **kwargs): return super(Order,self).dispatch(request, *args, **kwargs) # @method_decorator(auth)寫(xiě)在這里只能對(duì)get做驗(yàn)證,對(duì)post無(wú)用 def get(self,reqeust): v = reqeust.COOKIES.get('user1') return render(reqeust,'index.html',{'current_user': v})
1.4 cookie增刪改查操作:
1、設(shè)置Cookies
response.set_cookie("cookie_key","value")
2、獲取Cookies
value = request.COOKIES["cookie_key"] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
參數(shù):
default: 默認(rèn)值
salt: 加密鹽
max_age: 后臺(tái)控制過(guò)期時(shí)間
3、刪除Cookies
response.delete_cookie("cookie_key",path="/",domain=name)
4、檢測(cè)Cookies
if "cookie_name" is request.COOKIES :
5、設(shè)置加密的cookie
rep.set_signed_cookie(key,value,salt='加密鹽',...)
參數(shù):
key, 鍵
value='', 值
max_age=None, 超時(shí)時(shí)間,表示多少秒數(shù)之后失效
expires=None, 超時(shí)時(shí)間,表示失效的時(shí)間點(diǎn)。支持datetime 和 time.time
path='/', Cookie生效的路徑,/ 表示根路徑,特殊的:跟路徑的cookie可以被任何url的頁(yè)面訪問(wèn)
domain=None, Cookie生效的域名
secure=False, https傳輸
httponly=False 只能http協(xié)議傳輸,無(wú)法被JavaScript獲?。ú皇墙^對(duì),底層抓包可以獲取到也可以被覆蓋)
2,index頁(yè)面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h2>歡迎登錄:{{ current_user }}</h2> </body> </html>
3,login頁(yè)面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="/login/" method="POST"> <input type="text" name="username" placeholder="用戶(hù)名" /> <input type="password" name="pwd" placeholder="密碼" /> <input type="submit" /> </form> </body> </html>
運(yùn)行django之后,訪問(wèn)index,會(huì)自動(dòng)跳轉(zhuǎn)到login頁(yè)面,輸入賬戶(hù)密碼之后,自動(dòng)跳轉(zhuǎn)到index,并從cookie中取出username,打印出來(lái)
part 3 session
正常情況下,你無(wú)需任何設(shè)置就可以使用session功能。如果你刪除或修改過(guò)請(qǐng)檢測(cè)一下配置
1、編輯settings.py中MIDDLEWARE_CLASSES 配置,確保 'django.contrib.sessions.middleware.SessionMiddleware
'存在,如果沒(méi)有則添加。
2、編輯settings.py中INSTALLED_APPS配置,確保'django.contrib.sessions' (如果你是剛打開(kāi)這個(gè)應(yīng)用,別忘了運(yùn)行 manage.py syncdb )
Django中默認(rèn)支持Session,其內(nèi)部提供了5種類(lèi)型的Session供開(kāi)發(fā)者使用:
只需要更改settings/py文件中的SESSION_ENGINE
數(shù)據(jù)庫(kù)配置settings.py(默認(rèn)):
Django默認(rèn)支持Session,并且默認(rèn)是將Session數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,即:django_session 表中。
1.配置settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
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))
緩存配置settings.py:
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認(rèn)內(nèi)存緩存,也可以是memcache),此處別名依賴(lài)緩存的設(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傳輸cookie
SESSION_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)修改之后才保存
文件配置settings.py:
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個(gè)臨時(shí)地址tempfile.gettempdir()
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傳輸cookie
SESSION_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)修改之后才保存
緩存+數(shù)據(jù)庫(kù)配置settings.py:
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
加密cookie配置settings.py:
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
sessions使用:
1.獲取、設(shè)置、刪除Session中數(shù)據(jù)
def index(request):
request.session['k1'] #獲取session,如果沒(méi)有會(huì)報(bào)錯(cuò)
request.session.get('k1',None) #獲取session,如果沒(méi)有會(huì)返回None
request.session['k1'] = 123 #設(shè)置session,如果k1存在就覆蓋
request.session.setdefault('k1',123) #設(shè)置session,如果存在則不設(shè)置
del request.session["k1"] #只刪除k1,隨機(jī)字符串和其他session值還存在
request.session.session_key #當(dāng)前用戶(hù)隨機(jī)字符串
2.所有 鍵、值、鍵值對(duì)
request.session.keys() #獲取所有鍵
request.session.values() #獲取所有值
request.session.items() #獲取所有的鍵值
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
request.session.session_key # 用戶(hù)session的隨機(jī)字符串 request.session.clear_expired() #將所有Session失效日期小于當(dāng)前日期的數(shù)據(jù)刪除 request.session.exists("session_key") # 檢查 用戶(hù)session的隨機(jī)字符串 在數(shù)據(jù)庫(kù)中是否 request.session.delete("session_key") # 刪除當(dāng)前用戶(hù)的所有Session數(shù)據(jù)
request.session.set_expiry(value)
* 如果value是個(gè)整數(shù),session會(huì)在些秒數(shù)后失效。
* 如果value是個(gè)datatime或timedelta,session就會(huì)在這個(gè)時(shí)間后失效。
* 如果value是0,用戶(hù)關(guān)閉瀏覽器session就會(huì)失效。
* 如果value是None,session會(huì)依賴(lài)全局session失效策略。
上述就是小編為大家分享的cookie和session如何在Django框架中使用了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)頁(yè)標(biāo)題:cookie和session如何在Django框架中使用-創(chuàng)新互聯(lián)
瀏覽地址:http://www.rwnh.cn/article2/ceceic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、服務(wù)器托管、品牌網(wǎng)站制作、網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
全網(wǎng)營(yíng)銷(xiāo)推廣知識(shí)