什麼是cookie
cookie就是存儲在用戶端浏覽器上的鍵值對,其實Cookie是key-value結構,類似于一個python中的字典。随着伺服器端的響應發送給用戶端浏覽器。然後用戶端浏覽器會把Cookie儲存起來,當下一次再通路伺服器時把Cookie再發送給伺服器。 Cookie是由伺服器建立,然後通過響應發送給用戶端的一個鍵值對。用戶端會儲存Cookie,并會标注出Cookie的來源(哪個伺服器的Cookie)。當用戶端向伺服器送出請求時會把所有這個伺服器Cookie包含在請求中發送給伺服器,這樣伺服器就可以識别用戶端了!
cookie原理
伺服器産生,發給用戶端浏覽器,浏覽器儲存起來,下次發請求,會攜帶這個鍵值對到伺服器
Cookie的覆寫
如果伺服器端發送重複的Cookie那麼會覆寫原有的Cookie,例如用戶端的第一個請求伺服器端發送的Cookie是:Set-Cookie: a=A;第二請求伺服器端發送的是:Set-Cookie: a=AA,那麼用戶端隻留下一個Cookie,即:a=AA。
擷取Cookie
request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
參數:
- default: 預設值
- salt: 加密鹽
- max_age: 背景控制過期時間
Cookie設定
obj = HttpResponse(...)
obj = render(request, ...)
寫cookie:
obj.set_cookie(key,value)
return obj
删除cookie:
obj.delete_cookie('name')
return obj
加鹽,123是個密碼,解cookie的時候需要它,
object.set_signed_cookie('name','lay',salt='123')
return obj
5秒之後失效,三天失效
object.set_cookie('name','lay',max_age=60*60*24*3)
return obj
path
object.set_cookie('name', 'lqz', path='/shopping/')
return obj
參數:
- key, 鍵
- value='', 值
- max_age=None, 逾時時間 cookie需要延續的時間(以秒為機關)如果參數是\ None`` ,這個cookie會延續到浏覽器關閉為止
- expires=None, 逾時時間(IE requires expires, so set it if hasn't been already.)
- path='/', Cookie生效的路徑,/ 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面通路,浏覽器隻會把cookie回傳給帶有該路徑的頁面,這樣可以避免将cookie傳給站點中的其他的應用。
- domain=None, Cookie生效的域名 你可用這個參數來構造一個跨站cookie。如, domain=".example.com"所構造的cookie對下面這些站點都是可讀的:www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。如果該參數設定為 None ,cookie隻能由設定它的站點讀取
- secure=False, 浏覽器将通過HTTPS來回傳cookie
- httponly=False 隻能http協定傳輸,無法被JavaScript擷取(不是絕對,底層抓包可以擷取到也可以被覆寫)
Cookie登陸校驗
def auto_login(func):
def inner(request,*args,**kwargs):
is_login=request.COOKIES.get('is_login')
url=request.get_full_path()
print(url)
if is_login:
res=func(request,*args,**kwargs)
return res
else:
return redirect('/login/?returnurl=%s'%url)
return inner
def login(request):
if request.method=='GET':
return render(request,'login.html')
else:
returnurl=request.GET.get('returnurl')
name=request.POST.get('name')
pwd=request.POST.get('pwd')
if name=='lll' and pwd=='123':
if returnurl:
obj=redirect(returnurl)
else:
obj=redirect('/login/')
obj.set_cookie('is_login',True)
return obj
return HttpResponse('賬号密碼錯誤')
@auto_login
def order(request):
return HttpResponse('訂單')
session介紹
- 解決cookie不安全的問題,
- 存在伺服器上的鍵值對{'随機字元串':{name:lll,pwd:123}}
- 用session必須跟cookie連用
session解析圖
session使用方法
# 擷取、設定、删除Session中資料
#擷取session中鍵為k1的值
request.session['k1']
request.session.get('k1',None)
#設定session中鍵為k1值為123
request.session['k1'] = 123
'''設定内部機制
1 生成随機字元串:dfasfasdfa
2 去資料庫存儲
随機字元串 值 (字典形式) 逾時時間
dfasfasdfa {'name':'lqz','age':18,'sex':'男'} 逾時時間
3 寫入scookie(set_cookie('sessionid','dfasfasdfa'))
'''
request.session.setdefault('k1',123) # 存在則不設定
#删除session資料
del request.session['k1']
name=request.session['name']
# 正常流程
# 去cookie中取出随機字元串
# 取session那個表去查詢,取出session_data的資料,解密成字典,然後取name的值
# 所有 鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 會話session的key
request.session.session_key
#内部執行 request.COOKIES.get('sessionid') 拿到sessionid
# 将所有Session失效日期小于目前日期的資料删除
request.session.clear_expired()
# 檢查會話session的key在資料庫中是否存在
request.session.exists("session_key")
# 删除目前會話的所有Session資料(隻删資料庫)
request.session.delete()
# 删除目前的會話資料并删除會話的Cookie(資料庫和cookie都删)。
request.session.flush()
這用于確定前面的會話資料不可以再次被使用者的浏覽器通路
例如,django.contrib.auth.logout() 函數中就會調用它。
# 設定會話Session和Cookie的逾時時間
request.session.set_expiry(value)
* 如果value是個整數,session會在些秒數後失效。
* 如果value是個datatime或timedelta,session就會在這個時間後失效。
* 如果value是0,使用者關閉浏覽器session就會失效。
* 如果value是None,session會依賴全局session失效政策。
Session配置
在django的settings檔案内配置
1. 資料庫Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(預設)
2. 緩存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的緩存别名(預設記憶體緩存,也可以是memcache),此處别名依賴緩存的設定
3. 檔案Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 緩存檔案路徑,如果為None,則使用tempfile子產品擷取一個臨時位址tempfile.gettempdir()
4. 緩存+資料庫
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
其他公用設定項:
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,預設修改之後才儲存(預設)
session登陸檢驗
def auto_login(func):
def inner(request, *args, **kwargs):
nexturl = request.get_full_path()
if request.session.get('is_login'):
res = func(request, *args, **kwargs)
return res
else:
return redirect('/login/?nexturl=%s' % nexturl)
return inner
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
nexturl = request.GET.get('nexturl')
name = request.POST.get('name')
pwd = request.POST.get('pwd')
if name == 'lay' and pwd == '123':
if nexturl:
obj = redirect(nexturl)
else:
obj = redirect('/login/')
request.session['is_login'] = True
request.session['name'] = name
request.session['pwd'] = pwd
return obj
return HttpResponse('錯誤')
@auto_login
def order(request):
return HttpResponse('訂單')
@auto_login
def shop(request):
return HttpResponse('購物')
轉載于:https://www.cnblogs.com/layerluo/p/10004081.html