Django Session管理


参考视频:https://ke.qq.com/course/320021

一、Session与Cookie是什么

就像你去电商平台购物一样,而网站采用是HTTP协议,它本身就是一个无状态的,是记不住你上次来做了什么事,那怎么记住每个用户呢。
于是,服务器给每个用户贴了一个小纸条,上面记录了服务器给我们返回的一些信息。然后服务器看到这张小纸条就知道我们是谁了。

1.1.Cookie是怎么工作的?

  1. 浏览器第一次访问服务器时,服务器此时肯定不知道它的身份,所以创建一个独特的身份标识数据,格式为key=value,放入到Set-Cookie字段里,随着响应报文发给浏览器。
  2. 浏览器看到有Set-Cookie字段以后就知道这是服务器给的身份标识,于是就保存起来,下次请求时会自动将此key=value值放入到Cookie字段中发给服务器。
  3. 服务器收到请求报文后,发现Cookie字段中有值,就能根据此值识别用户的身份然后提供个性化的服务。

1.2.为什么需要Session?

如果将用户账户的一些信息都存入Cookie中,一旦信息被拦截,那么所有的账户信息都可
能被泄露,这是不安全的。所以就出现了Session,在一次会话中将重要信息保存在Session中,浏览器只记录SessionId一个SessionId对应一次会话请求。
在这里插入图片描述

二、Django使用Session

默认是开启的
在这里插入图片描述

2.1.在settings.py配置文件中设置客户端Cookie:

在这里插入图片描述
例如:
在这里插入图片描述

2.2.在视图中操作Session:

在这里插入图片描述

三、自己实现用户登录认证

views.py:

from django.shortcuts import render,redirect
from myldp.models import User

# 登录认证装饰器
def self_login_required(func):
    def inner(request):
        login_status = request.session.get('login_status', False)
        if login_status:
            return func(request)
        else:
            return redirect(login)
    return inner

# 首页
@self_login_required
def index(request):
    return render(request, 'index.html')

def login(request):
    if request.method == "GET":
        return render(request, 'login.html')
    elif request.method == "POST":
        # 获取前端登录的用户名和密码
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)
        # 对用户身份验证
        user = User.objects.filter(user=username)
        if user:
            for info in user:
                passwd = info.password
            if passwd == password:
                request.session['login_status']=True    # 自定义session内容,会保存到django_session表中
                request.session['login_user']=username
                return redirect(index)      # 重定向到函数名,这里是首页
            else:
                msg = "用户名或密码输入错误"
        else:
            msg = "用户名或密码输入错误"
        return render(request, 'login.html', {"msg": msg})
# 登出
def logout(request):
    auth.logout(request)    # 清除当前用户的session信息
    return redirect(login)
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页