Django框架 之 Cookie、Session整理補充
阿新 • • 發佈:2018-08-31
rect() text backends response urn space 關閉 image sub
瀏覽目錄
-
Django實現的Cookie
-
Django實現的Session
一、Django實現的Cookie
1、獲取Cookie
1 2 3 4 5 6 |
request.COOKIES[ ‘key‘ ]
request.get_signed_cookie(key, default = RAISE_ERROR, salt = ‘‘, max_age = None )
#參數:
default: 默認值
salt: 加密鹽
max_age: 後臺控制過期時間
|
2、設置Cookie
1 2 3 4 |
rep = HttpResponse(...) 或 rep = render(request, ...) 或 rep = redirect()
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt = ‘加密鹽‘ ,...)
|
參數:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
def set_cookie( self , key, 鍵
value = ‘‘, 值 max_age = None , 超長時間
expires = None , 超長時間
path = ‘/‘ , Cookie生效的路徑,
瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣可以避免將
cookie傳給站點中的其他的應用。
/ 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問
domain = None , Cookie生效的域名
你可用這個參數來構造一個跨站cookie。
如, domain = ".example.com"
所構造的cookie對下面這些站點都是可讀的:
www.example.com 、 www2.example.com
和an.other.sub.domain.example.com 。
如果該參數設置為 None ,cookie只能由設置它的站點讀取。
secure = False , 如果設置為 True ,瀏覽器將通過HTTPS來回傳cookie。
httponly = False 只能http協議傳輸,無法被JavaScript獲取
(不是絕對,底層抓包可以獲取到也可以被覆蓋)
): pass
|
由於cookie保存在客戶端的電腦上,所以,JavaScript和jquery也可以操作cookie。
1 2 3 |
<script src = ‘/static/js/jquery.cookie.js‘ >
< / script> $.cookie( "key" , value,{ path: ‘/‘ });
|
3、刪除Cookie
1 |
response.delete_cookie( "cookie_key" ,path = "/" ,domain = name)
|
cookie存儲到客戶端
優點:
數據存在在客戶端,減輕服務器端的壓力,提高網站的性能。
缺點:
安全性不高:在客戶端機很容易被查看或破解用戶會話信息
二、Django實現的Session
1、基本操作
1 2 3 4 5 6 7 8 |
1 、設置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 :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#其他操作
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() 刪除當前的會話數據並刪除會話的Cookie。
這用於確保前面的會話數據不可以再次被用戶的瀏覽器訪問
例如,django.contrib.auth.logout() 函數中就會調用它。
11 用戶session的隨機字符串
request.session.session_key
# 將所有Session失效日期小於當前日期的數據刪除
request.session.clear_expired()
# 檢查 用戶session的隨機字符串 在數據庫中是否
request.session.exists( "session_key" )
# 刪除當前用戶的所有Session數據
request.session.delete( "session_key" )
request.session.set_expiry(value)
* 如果value是個整數,session會在些秒數後失效。
* 如果value是個datatime或timedelta,session就會在這個時間後失效。
* 如果value是 0 ,用戶關閉瀏覽器session就會失效。
* 如果value是 None ,session會依賴全局session失效策略。
|
2、流程解析圖
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: #設置session內部的字典內容 request.session[‘is_login‘]=‘true‘ request.session[‘username‘]=username #登錄成功就將url重定向到後臺的url return redirect(‘/backend/‘) #登錄不成功或第一訪問就停留在登錄頁面 return render(request,‘login.html‘) def backend(request): print(request.session,"------cookie") print(request.COOKIES,‘-------session‘) """ 這裏必須用讀取字典的get()方法把is_login的value缺省設置為False, 當用戶訪問backend這個url先嘗試獲取這個瀏覽器對應的session中的 is_login的值。如果對方登錄成功的話,在login裏就已經把is_login 的值修改為了True,反之這個值就是False的 """ is_login=request.session.get(‘is_login‘,False) #如果為真,就說明用戶是正常登陸的 if is_login: #獲取字典的內容並傳入頁面文件 cookie_content=request.COOKIES session_content=request.session username=request.session[‘username‘] return render(request,‘backend.html‘,locals()) else: """ 如果訪問的時候沒有攜帶正確的session, 就直接被重定向url回login頁面 """ return redirect(‘/login/‘) def log_out(request): """ 直接通過request.session[‘is_login‘]回去返回的時候, 如果is_login對應的value值不存在會導致程序異常。所以 需要做異常處理 """ try: #刪除is_login對應的value值 del request.session[‘is_login‘] # OR---->request.session.flush() # 刪除django-session表中的對應一行記錄 except KeyError: pass #點擊註銷之後,直接重定向回登錄頁面 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存儲的相關配置
1、數據庫配置(默認)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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,默認修改之後才保存(默認)
|
2、緩存配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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,默認修改之後才保存
|
3、文件配置
1 2 3 4 5 6 7 8 9 10 11 12 |
a. 配置 settings.py
SESSION_ENGINE = ‘django.contrib.sessions.backends.file‘ # 引擎
SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()
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,默認修改之後才保存
|
Django框架 之 Cookie、Session整理補充