django-session管理
733字约2分钟
2024-09-29
Session与Cookie是什么
就像你去电商平台购物一样,而网站采用是HTTP协议,它本身就是一个无状态的,是记不住你上次来做了什 么事,那怎么记住每个用户呢。 于是,服务器给每个用户贴了一个小纸条,上面记录了服务器给我们返回的一些信息。然后服务器看到这张 小纸条就知道我们是谁了。
这个小纸条就是Cookie。那么Cookie怎么工作的呢?
- 浏览器第一次访问服务器时,服务器此时肯定不知道它的身份,所以创建一个独特的身份标识数据,格式 为key=value,放入到Set-Cookie字段里,随着响应报文发给浏览器。 
- 浏览器看到有Set-Cookie字段以后就知道这是服务器给的身份标识,于是就保存起来,下次请求时会自动 将此key=value值放入到Cookie字段中发给服务器。 
- 服务器收到请求报文后,发现Cookie字段中有值,就能根据此值识别用户的身份然后提供个性化的服务。 

有了Cookie实现了有状态这一需求,那为什么又来一个Session呢?
试想一下,如果将用户账户的一些信息都存入Cookie中的话,一旦信息被拦截,那么所有的账户信息都会可 能被泄露丢,这是不安全的。所以就出现了Session,在一次会话中将重要信息保存在Session中,浏览器只 记录SessionId一个SessionId对应一次会话请求。

Django使用Session

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

在视图中操作Session:

自己实现用户登录认证
案例:自己实现登录认证机制
- 登录 
- 视图验证登录 
from devops2.user_login import login_decorator
@login_decorator  #自定义认证登录装饰器
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')
        password = request.POST.get('password')
        """
        ###############内置认证机制################
        #验证用户
        user = auth.authenticate(username=username,password=password)  #验证通过返回用户名,否则返回None
        if user:
            auth.login(request,user)  #将request与用户对象(包含session)传给login()函数
            request.session['username'] = username  #往session临时存储数据
            return redirect('/')   #跳转到首页
        else:
            msg = '用户名或密码错误'
            return render(request,'login.html',{'msg':msg})
        """
        #自定义用户认证
        user_obj = User.objects.get(user=username)
        if user_obj.user:
            if user_obj.password == password:
                request.session['is_login'] = True
                request.session['username'] = username
                return redirect('/')
            else:
                msg = '用户名或密码错误!'
                return render(request, 'login.html', {'msg': msg})
        else:
            msg = '用户名或密码错误!'
            return render(request, 'login.html', {'msg': msg})- 退出登录
def logout(request):
    request.session.flush()
    return redirect('/login')   #跳转到登录页- 装饰器
from django.shortcuts import redirect
#登录装饰器
def login_decorator(func):
    def inner(request):
        is_login = request.session.get('is_login',False)
        if is_login:
            return func(request)  #执行原函数
        else:
            return redirect('/login')
    return inner