Django3 0 Sessions使用示例

2021-10-03 12:29:03 字數 4594 閱讀 5010

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...