1. 程式人生 > >python Cookie Session 相關用法

python Cookie Session 相關用法

requires dir xxx use 數據庫 import 需求 一個 刪除cookie

Cookie
一.前言
1.http協議是無狀態的.
無狀態的意思是每次請求都是獨立的,它的執行情況和結果與前面的請求和之後的請求都無直接關系,它不會受前面的請求響
應情況直接影響,也不會直接影響後面的請求響應情況.
2.cookie產生背景;
狀態可以理解為客戶端和服務器在某次會話中產生的數據,那無狀態的就以為這些數據不會被保留。會話中產生的數據又是
我們需要保存的,也就是說要“保持狀態”.
3.什麽是cookie?
Cookie具體指的是一段小信息,它是服務器發送出來存儲在瀏覽器上的一組組鍵值對,下次訪問服務器時瀏覽器會自動攜帶
這些鍵值對,以便服務器提取有用信息。
4.cookie的原理:
由服務器產生內容,瀏覽器收到請求後保存在本地;當瀏覽器再次訪問時,瀏覽器會自動帶上Cookie,這樣服務器就能通過
Cookie的內容來判斷這個是“誰”了。
5.cookie的劣勢
Cookie雖然在一定程度上解決了“保持狀態”的需求,但是由於Cookie本身最大支持4096字節,以及Cookie本身保存在客戶端,可能被攔截或竊取
二.Django 中操作Cookie
1.獲取Cookie
request.COOKIE[‘key‘] 普通
request.get_signed_cookie(‘key‘,default=RAISE_ERROR, salt=‘ ‘,max_age=None)

get_signed_cookie方法的參數:

default: 默認值
salt: 加密鹽
max_age: 後臺控制過期時間
2.設置Cookie
rep = HttpResponse(...)
rep = render(request, ...)

rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt=‘加密鹽‘,...)

參數:

key, 鍵
value=‘‘, 值
max_age=None, 超時時間
expires=None, 超時時間(IE requires expires, so set it if hasn‘t been already.)
path=‘/‘, Cookie生效的路徑,/ 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問
domain=None, Cookie生效的域名
secure=False, https傳輸
httponly=False 只能http協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋)
3.刪除Cookie
def logout(request):
rep= redirect(‘/login‘)
rep.delete_cookie(‘is_login‘)
return rep
示例:
from django.shortcuts import render,redirect,HttpResponse
#裝飾器
def login_required(func):
def inner(request,*args,**kwargs):
return_url=request.path_info #home獲取用戶輸入的查詢信息
print(111)
if request.COOKIES.get(‘is_login‘,‘‘)==‘True‘: #如果該用戶在線
# if request.get_signed_cookie(‘is_login‘,‘‘,salt=‘xxx‘)==‘True‘: #加鹽獲取cookie
ret=func(request,*args,**kwargs) #執行home函數將結果賦值給ret
return ret #返回ret
else:
return redirect(‘/login/?ReturnUrl={}‘.format(return_url)) #如果用戶還沒登錄直接跳轉到login頁面
# 加上用戶訪問的 頁面路徑信息
return inner


def login(request):
err_msg=‘‘
if request.method==‘POST‘:
username=request.POST.get(‘username‘)
pwd=request.POST.get(‘pwd‘)
if username==‘alex‘ and pwd==‘alex‘: #當用戶驗證成功以後
return_url=request.GET.get(‘ReturnUrl‘) #獲取用戶想要訪問的頁面路徑信息
# print(return_url)
if return_url: #如果訪問的路徑存在
print(‘aaa‘)
# print(return_url)
ret = redirect(return_url) # 則直接跳轉到訪問頁面
else:
ret= redirect(‘/index/‘) #如果路勁信息不存在 則直接跳轉到index
ret.set_cookie(‘is_login‘,‘True‘) #保存狀態 設置COOKIE
# ret.set_signed_cookie(‘is_login‘,‘True‘,salt=‘xxx‘) #加鹽
return ret
else: #用戶驗證不成功
err_msg="用戶名或密碼錯誤"
return render(request,‘login.html‘,{‘err_msg‘:err_msg})


# def index(request):
# if request.COOKIES.get(‘is_login‘)==‘True‘:
# return render(request,‘index.html‘)
# else:
# return redirect("/login/")
@login_required
def index(request):
return render(request,‘index.html‘)

@login_required #先執行裝飾器
def home(request): #匹配到home執行home函數

return HttpResponse(‘這是home頁面‘)

# 刪除
@login_required
def logout(request):
rep= redirect(‘/login‘)
rep.delete_cookie(‘is_login‘)
return rep
Session
一.前言
1.產生背景
Cookie彌補了HTTP無狀態的不足,讓服務器知道來的人是“誰”;但是Cookie以文本的形式保存在本地,自身安全性較差;
所以我們就通過Cookie識別不同的用戶,對應的在Session裏保存私密的信息以及超過4096字節的文本。
2.session的優勢
支持更多的字節,並且他保存在服務器,有較高的安全性
二.Django 中Session相關方法
1.獲取session中的數據
request.session[‘k1‘]
request.session.get(‘k1‘,None)
2.設置session中的數據
request.session[‘k1‘]=123
request.session.setdefault(‘k1‘,123)
3.刪除session中的數據
del request.session[‘k1‘]
4.所有鍵
request.session.keys()
request.session.iterkeys()
5.所有值
request.session.values()
request.session.itervalues()
6.所有鍵值對
request.session.iteritems()
7.會話session的key
request.session.session_key
8.將所有Session失效日期小於當前日期的數據刪除
request.session.clear_expired()
9.檢查會話session的key在數據庫中是否存在
request.session.exists("session_key")
10. 刪除當前會話的所有Session數據
request.session.delete()
11.刪除當前的會話數據並刪除會話的Cookie
request.session.flush() 這用於確保前面的會話數據不可以再次被用戶的瀏覽器訪問
12. 設置會話Session和Cookie的超時時間
request.session.set_expiry(value)
*如果value是個整數,session會在些秒數後失效。
* 如果value是個datatime或timedelta,session就會在這個時間後失效。
* 如果value是0,用戶關閉瀏覽器session就會失效。
* 如果value是None,session會依賴全局session失效策略。
三.Django中的Session配置
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,默認修改之後才保存(默認)

python Cookie Session 相關用法