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 点击退出 用户就显示未登录状态
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42662411/article/details/104780998