django框架cookie和session用法例項詳解
本文例項講述了django框架cookie和session用法。分享給大家供大家參考,具體如下:
首先知道http協議
http協議它是無狀態的協議,驗證的資訊不會保留
基於請求響應,短連線
cookie
指一段小資訊,內部是一組組的鍵值對,儲存在客戶端
訪問一個地址時,伺服器生成一個cookie,由瀏覽器保留在本地,再次訪問地址時就會攜帶這個cookie,一般用於使用者資訊的驗證
cookie的設定:
obj.set_cookie(key,value,...)
下面來看一個簡單的例子
#設定cookie def login(request): if request.method=="POST": user=request.POST.get("user") pwd=request.POST.get("pwd") user=UserInfo.objects.filter(user=user,pwd=pwd).first() if user: obj=HttpResponse("登陸成功") obj.set_cookie("is_login",True) return obj return render(request,"login.html") #獲取cookie並進行判斷 def index(request): ret=request.COOKIES.get("is_login") if not ret: return redirect("/login/") return render(request,"index.html")
其他引數
引數:
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=True 只能http協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋)
cookie的刪除
obj.delete_cookie("is_login")
下面來看一個登陸和登出頁面
def books(request): is_login=request.COOKIES.get("is_login") if not is_login: return_url=request.path_info #判斷是否有cookies沒有則記錄到return_url if return_url: return redirect("{}?return_url={}".format("/login/",return_url)) #將return_url加到路徑後面返回到login頁面,等到使用者驗證登陸後直接跳轉到這個頁面 book_list=Book.objects.all() return render(request,"books.html",locals()) def login(request): error_msg='' if request.method=="POST": user=request.POST.get("user") pwd=request.POST.get("pwd") user_au=UserInfo.objects.filter(user=user,pwd=pwd).first() #從資料庫中驗證使用者 if user_au: return_url=request.GET.get('return_url') if return_url: #判斷是否有return_url ret=redirect(return_url) else: ret=HttpResponse("進入其他頁面") ret.set_cookie("is_login",True) #驗證成功則設定cookies return ret error_msg="使用者名稱或者密碼錯誤" return render(request,"login.html",locals()) def logout(request): ret=redirect("/login/") ret.delete_cookie('is_login') return ret
驗證第一種情況
---------------------------》》》》》
#####################################################################################################################################################################################
驗證第二種情況
----------》》》》》------》》》
session
由於cookies儲存在客戶端上面,存在不安全因素,並且有長度限制---4096
進而引入了session
session的用法
# 獲取、設定、刪除Session中資料 request.session['k1'] #獲取 request.session.get('k1',None) #獲取 request.session['k1'] = 123 #設定 request.session.setdefault('k1',123) # 存在則不設定 del request.session['k1'] # 所有 鍵、值、鍵值對 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 會話session的key request.session.session_key # 將所有Session失效日期小於當前日期的資料刪除 request.session.clear_expired() # 檢查會話session的key在資料庫中是否存在 request.session.exists("session_key") # 刪除當前會話的所有Session資料 request.session.delete() #刪除reponse sessionid,使用者已經訪問不了了,但是可以看到 request sessionid # 刪除當前的會話資料並刪除會話的Cookie。 request.session.flush() # reponse 和 request sessionid都看不到 這用於確保前面的會話資料不可以再次被使用者的瀏覽器訪問 例如,django.contrib.auth.logout() 函式中就會呼叫它。 # 設定會話Session和Cookie的超時時間 request.session.set_expiry(value) * 如果value是個整數,session會在些秒數後失效。 * 如果value是個datatime或timedelta,session就會在這個時間後失效。 * 如果value是0,使用者關閉瀏覽器session就會失效。 * 如果value是None,session會依賴全域性session失效策略。
下面來看一個例子
def books(request): # is_login=request.COOKIES.get("is_login") is_login=request.session.get("is_login") if not is_login: return_url=request.path_info if return_url: return redirect("{}?return_url={}".format("/login/",return_url)) book_list=Book.objects.all() return render(request,pwd=pwd).first() if user_au: return_url=request.GET.get('return_url') if return_url: ret=redirect(return_url) else: ret=HttpResponse("進入其他頁面") # ret.set_cookie("is_login",True) request.session['is_login']=True return ret error_msg="使用者名稱或者密碼錯誤" return render(request,locals()) def logout(request): ret=redirect("/login/") # ret.delete_cookie('is_login') request.session.delete() #刪除Reponse sessionID # request.session.flush() #刪除Reponse sessionID和Request sessionID return ret
設定了session之後,資料庫會自動生成一個表,表名:django_session
我們來檢視session的預設設定
from django.conf import settings,global_settings 通過 global_settings檢視到下面資訊 ############ # SESSIONS # ############ # Cache to store session data if using the cache session backend. SESSION_CACHE_ALIAS = 'default' # Cookie name. This can be whatever you want. SESSION_COOKIE_NAME = 'sessionid' # Age of cookie,in seconds (default: 2 weeks). SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 # A string like ".example.com",or None for standard domain cookie. SESSION_COOKIE_DOMAIN = None # Whether the session cookie should be secure (https:// only). SESSION_COOKIE_SECURE = False # The path of the session cookie. SESSION_COOKIE_PATH = '/' # Whether to use the non-RFC standard httpOnly flag (IE,FF3+,others) SESSION_COOKIE_HTTPONLY = True # Whether to save the session data on every request. SESSION_SAVE_EVERY_REQUEST = False # Whether a user's session cookie expires when the Web browser is closed. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # The module to store session data SESSION_ENGINE = 'django.contrib.sessions.backends.db' # Directory to store session files if using the file session module. If None,# the backend will use a sensible default. SESSION_FILE_PATH = None # class to serialize session data SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
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,預設修改之後才儲存(預設)
希望本文所述對大家基於Django框架的Python程式設計有所幫助。