這篇文章將為大家詳細講解有關cookie和session如何在django框架中應用,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
首先知道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,"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:
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,"login.html",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,默認修改之后才保存(默認)
關于cookie和session如何在django框架中應用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。