2. session在django中的儲存位置
3. 物件型別
4. 函式說明
5. 使用普通快取settings.py配置
6. view.py的編寫
7. urls.py配置
http是一種無狀態協議,每次請求是沒有關聯性的,
即客戶端請求完之後,再次請求,伺服器就不記得客戶端了。
如果需要實現類似登入,這種有狀態的場景,就需要有一種機制來記錄客戶端狀態。
例如,在客戶端登入成功的情況下,才能訪問某些頁面。
session就是用來記錄這種狀態的。
session是一段儲存在伺服器端的字串。該字串記錄了客戶端的狀態。
cookie和session類似,只不過cookie儲存在客戶端中。
注意:該實現過程只是為了說清楚原理,細節部分並不一定準確登入:
客戶端向伺服器發出登入請求
伺服器驗證登入合法
伺服器生成一段字串(session)儲存起來
伺服器將字串(session)打包在響應中發給客戶端
客戶端收到響應後將字串(cookie)取出儲存起來
客戶端向伺服器請求登入後能看到的其他頁面,並將字串(cookie)打包在內
伺服器收到請求後將字串(cookie)取出,與原先儲存的字串(session)對比
伺服器字串對比成功,伺服器給出響應
session超時:(使用者登入後不操作,session超時則需要重新登入)
session超時,伺服器清除session
客戶端請求登入以後才能訪問的頁面
伺服器中session已被清除,認為客戶端未認證,返回登入頁面
登出:客戶端主動傳送登出
伺服器收到請求後,清除session
request:request.session:
django.contrib.sessions.backends.cache.sessionstore
(取決於session儲存位置)
from django.contrib.auth import login, logout, authenticate
# 檢測登入資訊
authenticate(
)# 將session標記為登入狀態
login(
)# 將session標記為登出狀態
logout(
)# 重置session的超時時間
# django.contrib.sessions.backends.cache.sessionstore.set_expiry()
request.session.set_expiry(
)
[
,'django.contrib.admin'
,'django.contrib.auth'
,'django.contrib.contenttypes'
,'django.contrib.sessions'
,'django.contrib.messages'
,'django.contrib.staticfiles',]
middleware =
['django.middleware.security.securitymiddleware'
,# django 預設啟動了seesion中介軟體
'django.contrib.sessions.middleware.sessionmiddleware'
,'django.middleware.common.commonmiddleware'
,'django.middleware.csrf.csrfviewmiddleware'
,'django.contrib.auth.middleware.authenticationmiddleware'
,# django 3.0已棄用
# 'django.contrib.auth.middleware.sessionauthenticationmiddleware',
'django.contrib.messages.middleware.messagemiddleware'
,'django.middleware.clickjacking.xframeoptionsmiddleware',]
# session引擎,使用普通快取儲存session,不配置將存在預設的資料庫中
session_engine =
'django.contrib.sessions.backends.cache'
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.views.generic import view
overtime =
600# 認證檢測類
class
auth
(view)
:# 重寫父類dispatch,加入認證功能
defdispatch
(self, request,
*args,
**kwargs)
:# 如果已認證
if request.user.is_authenticated:
# 當有頁面操作時,重置超時時間(600秒)
request.session.set_expiry(overtime)
# 認證成功呼叫父類方法,分配請求
return
super()
.dispatch(request,
*args,
**kwargs)
# 還沒認證重定向到登入介面
else
:return redirect(
'test:login'
)# 登入類
class
login
(view)
:# 使用者傳送get請求,返回登入介面
defget
(self, request)
:return render(request,
'test/login.html'
)# 使用者傳送post請求,登入認證
defpost
(self, request)
:# 獲取使用者名稱和密碼
username = request.post[
'username'
] password = request.post[
'password'
]# 使用admin的表檢測使用者資訊
user = authenticate(request, username=username, password=password)
# 如果檢測成功則返回使用者名稱
if user is
notnone
:# 標記session為登入
login(request, user)
# 重置session過期時間(600秒後過期)
request.session.set_expiry(overtime)
# 返回登入後的頁面給使用者
return redirect(
'test:index'
)# 如果檢測失敗,呼叫get,返回登入介面
else
: self.get(request)
# 登入後的類,繼承認證檢測類
class
index
(auth)
:def
get(self, request)
:return render(request,
'test/index.html'
)# 登出類,繼承認證檢測類(使用者沒登入怎麼登出)
class
logout
(auth)
:def
get(self, request)
:# 將session標記為登出
logout(request)
# 返回登入介面
return redirect(
'test:login'
)
from django.urls import path
from
.import views
'test'
urlpatterns =
[ path(
'', views.login.as_view(
), name =
'login'),
path(
'index.html'
, views.index.as_view(
), name =
'index'),
path(
'logout.html'
, views.logout.as_view(
), name =
'logout'),
]
Django中session和cookie的用法
session 存在伺服器端,用request物件進行設定 設定session 在後端寫入 request.session money 100 缺省會在cookie中產生乙個sessionid 獲取session值 只能在後端獲取 print request.session.get money co...
Django的session操作使用
配置在這裡 操作 通過httprequest物件的session屬性進行會話的讀寫操作 1 以鍵值對的格式寫session。request.session 鍵 值2 根據鍵讀取值。request.session.get 鍵 預設值 3 清除所有session,在儲存中刪除值部分。request.se...
Django中session的使用
1 存在於服務端的鍵值對 2同乙個瀏覽器不允許登入多個賬戶,不同瀏覽器可以登入同乙個賬戶 3session的使用 必須遷移資料 增 request.session name lqz 查 request.session name 改 request.session name egon 刪 del re...