django session 狀態保持

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 點擊退出 用戶就顯示未登錄狀態
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章