Django實(shí)現(xiàn)的COOKIE
1、獲取Cookie
request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
#參數(shù):
default: 默認(rèn)值
salt: 加密鹽
max_age: 后臺(tái)控制過期時(shí)間
2、設(shè)置Cookie
rep = HttpResponse(...) 或 rep = render(request, ...) 或 rep = redirect()
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密鹽',...)
參數(shù):
'''
def set_cookie(self, key, 鍵
value='', 值
max_age=None, 超長時(shí)間
expires=None, 超長時(shí)間
path='/', Cookie生效的路徑,
瀏覽器只會(huì)把cookie回傳給帶有該路徑的頁面,這樣可以避免將
cookie傳給站點(diǎn)中的其他的應(yīng)用。
/ 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問
domain=None, Cookie生效的域名
你可用這個(gè)參數(shù)來構(gòu)造一個(gè)跨站cookie。
如, domain=".example.com"
所構(gòu)造的cookie對(duì)下面這些站點(diǎn)都是可讀的:
www.example.com 、 www2.example.com
和an.other.sub.domain.example.com 。
如果該參數(shù)設(shè)置為 None ,cookie只能由設(shè)置它的站點(diǎn)讀取。
secure=False, 如果設(shè)置為 True ,瀏覽器將通過HTTPS來回傳cookie。
httponly=False 只能http協(xié)議傳輸,無法被JavaScript獲取
(不是絕對(duì),底層抓包可以獲取到也可以被覆蓋)
): pass
'''
由于cookie保存在客戶端的電腦上,所以,JavaScript和jquery也可以操作cookie。
<script src='/static/js/jquery.cookie.js'>
</script> $.cookie("key", value,{ path: '/' });
3 刪除cookie
response.delete_cookie("cookie_key",path="/",domain=name)
cookie存儲(chǔ)到客戶端
優(yōu)點(diǎn):
數(shù)據(jù)存在在客戶端,減輕服務(wù)器端的壓力,提高網(wǎng)站的性能。
缺點(diǎn):
安全性不高:在客戶端機(jī)很容易被查看或破解用戶會(huì)話信息
Django實(shí)現(xiàn)的SESSION
1、 基本操作
1、設(shè)置Sessions值
request.session['session_name'] ="admin"
2、獲取Sessions值
session_name = request.session["session_name"]
3、刪除Sessions值
del request.session["session_name"]
4、檢測是否操作session值
if "session_name" is request.session :
5、get(key, default=None)
fav_color = request.session.get('fav_color', 'red')
6、pop(key)
fav_color = request.session.pop('fav_color')
7、keys()
8、items()
9、setdefault()
10、flush() 刪除當(dāng)前的會(huì)話數(shù)據(jù)并刪除會(huì)話的Cookie。
這用于確保前面的會(huì)話數(shù)據(jù)不可以再次被用戶的瀏覽器訪問
例如,django.contrib.auth.logout() 函數(shù)中就會(huì)調(diào)用它。
11 用戶session的隨機(jī)字符串
request.session.session_key
# 將所有Session失效日期小于當(dāng)前日期的數(shù)據(jù)刪除
request.session.clear_expired()
# 檢查 用戶session的隨機(jī)字符串 在數(shù)據(jù)庫中是否
request.session.exists("session_key")
# 刪除當(dāng)前用戶的所有Session數(shù)據(jù)
request.session.delete("session_key")
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失效策略。
2、 流程解析圖
image.png
3、 示例
views:
def log_in(request):
if request.method=="POST":
username=request.POST['user']
password=request.POST['pwd']
user=UserInfo.objects.filter(username=username,password=password)
if user:
#設(shè)置session內(nèi)部的字典內(nèi)容
request.session['is_login']='true'
request.session['username']=username
#登錄成功就將url重定向到后臺(tái)的url
return redirect('/backend/')
#登錄不成功或第一訪問就停留在登錄頁面
return render(request,'login.html')
def backend(request):
print(request.session,"------cookie")
print(request.COOKIES,'-------session')
"""
這里必須用讀取字典的get()方法把is_login的value缺省設(shè)置為False,
當(dāng)用戶訪問backend這個(gè)url先嘗試獲取這個(gè)瀏覽器對(duì)應(yīng)的session中的
is_login的值。如果對(duì)方登錄成功的話,在login里就已經(jīng)把is_login
的值修改為了True,反之這個(gè)值就是False的
"""
is_login=request.session.get('is_login',False)
#如果為真,就說明用戶是正常登陸的
if is_login:
#獲取字典的內(nèi)容并傳入頁面文件
cookie_content=request.COOKIES
session_content=request.session
username=request.session['username']
return render(request,'backend.html',locals())
else:
"""
如果訪問的時(shí)候沒有攜帶正確的session,
就直接被重定向url回login頁面
"""
return redirect('/login/')
def log_out(request):
"""
直接通過request.session['is_login']回去返回的時(shí)候,
如果is_login對(duì)應(yīng)的value值不存在會(huì)導(dǎo)致程序異常。所以
需要做異常處理
"""
try:
#刪除is_login對(duì)應(yīng)的value值
del request.session['is_login']
# OR---->request.session.flush() # 刪除django-session表中的對(duì)應(yīng)一行記錄
except KeyError:
pass
#點(diǎn)擊注銷之后,直接重定向回登錄頁面
return redirect('/login/')
template:
===================================login.html==================
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login/" method="post">
<p>用戶名: <input type="text" name="user"></p>
<p>密碼: <input type="password" name="pwd"></p>
<p><input type="submit"></p>
</form>
</body>
</html>
===================================backend.html==================
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>hello {{ username }}</h3>
<a href="/logout/">注銷</a>
</body>
</html>
4、session存儲(chǔ)的相關(guān)配置
(1)數(shù)據(jù)庫配置(默認(rèn)):
Django默認(rèn)支持Session,并且默認(rèn)是將Session數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫中,即:django_session 表中。
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認(rèn))
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過期(默認(rèn))
SESSION_SAVE_EVERY_REQUEST = False # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存(默認(rèn))Django默認(rèn)支持Session,并且默認(rèn)是將Session數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫中,即:django_session 表中。
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認(rèn))
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過期(默認(rèn))
SESSION_SAVE_EVERY_REQUEST = False # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存(默認(rèn))
(2)緩存配置
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認(rèn)內(nèi)存緩存,也可以是memcache),此處別名依賴緩存的設(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過期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存
(3)文件配置
a. 配置 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過期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存