1-session保存狀態
狀態保持----cookie和session
什麼是狀態保持:
1.http協議是無狀態的:每次請求都是一次新的請求,不會記得之前通信的狀態
2.客戶端與服務器端的一次通信,就是一次會話實現狀態保持的方式:在客戶端或服務器端存儲與會話有關的數據
3.存儲方式包括cookie、session,會話一般指session對象
4. 使用cookie,所有數據存儲在客戶端,注意不要存儲敏感信息
5.使用sesison方式,所有數據存儲在服務器端,在客戶端cookie中存儲session_id
6狀態保持的目的是在一段時間內跟蹤請求者的狀態,可以實現跨頁面訪問當前請求者的數據
- 注意:不同的請求者之間不會共享這個數據,與請求者一一對應
2-啓用session
在settings.py文件中 默認是都有的啓用的
然後再pycharm 中 找到tools工具
點擊tools中的 run manage.py Task
執行這兩條命令後 再去navicat數據庫中查看django_session
注: 使用session之前需要先執行makemigrations,migrate的模型映射文件命令,在數據庫中有生成django_session的表格.
3-使用session
啓用會話後,每個HttpRequest對象將具有一個session屬性,它是一個類字典對象
- get(key, default=None):根據鍵獲取會話的值
- flush():刪除當前的會話數據並刪除會話的Cookie
1.一個既可讀又可寫的類似於字典的對象,表示當前的會話.
2.在登錄中使用request.session設置一個登錄的信息.
3.在主頁面中獲取設置的值,然後傳給模板.
4.使用request.session.flush()清除會話數據.
4-用戶登錄狀態例子
1-在views.py中
from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse
from django.views import View
# Create your views here.
def index(request):
"""
查找用戶是否存在 存在就顯示登錄狀態 否則就登錄
:param request:
:return:
"""
username =request.session.get("username","用戶未登錄")
return render(request,'FM/index.html',context={
'username':username,
})
class LoginResponse(View):
def get(self,request):
return render(request,'FM/login.html')
def post(self,request):
"""
1-獲取參數
2-校驗參數
3-業務邏輯 session的判斷
4-返回響應
:param request:
:return:
"""
#1-獲取用戶名
#2-設置session
#3-設置session過期時間 默認15天 如果沒有勾選記住我 當關閉遊覽器 會清除session
username = request.POST.get("username")
request.session["username"] = username
request.session.set_expiry(0) #關閉遊覽器清除
return redirect(reverse("FM:index"))
def exit(request):
request.session.flush()
return redirect(reverse("FM:index"))
2-url路由配置
from django.urls import path
from . import views
app_name="FM"
urlpatterns = [
path('index/',views.index,name="index"),
path('login/',views.LoginResponse.as_view(),name="login"),
path('exit/',views.exit,name="exit"),
]
3-模板內容
在templates目錄下創建FM目錄 在FM目錄下創建Index.html以及login.html
index.html裏面的內容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首頁</title>
</head>
<body>
歡迎: {{ username }}<br>
<a href="{% url 'FM:login' %}">登錄</a><br>
<a href="{% url 'FM:exit' %}">退出</a>
</body>
</html>
login.html裏面的內容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<input type="text" name="username" placeholder="請輸入用戶名"><br>
<input type="password" name="password" placeholder="請輸入密碼"><br>
<input type="email" name="email" placeholder="">
<input type="submit" value="登錄">
</form>
</body>
</html>
5-會話過期時間
- set_expiry(value):設置會話的超時時間
- 如果沒有指定,則兩個星期後過期
- 如果value是一個整數,會話將在values秒沒有活動後過期
- 若果value是一個imedelta對象,會話將在當前時間加上這個指定的日期/時間過期
- 如果value爲0,那麼用戶會話的Cookie將在用戶的瀏覽器關閉時過期
- 如果value爲None,那麼會話永不過期
可以不配置,那麼都是默認的選項
6-效果演示
清除session 點擊退出 用戶就顯示未登錄狀態