Django 用Session和Cookie分别实现记住用户登录状态

本文介绍了如何在Django中利用Cookie和Session保持用户登录状态。Cookie是将信息存储在客户端,而Session则将敏感信息保存在服务端,提供更高的安全性。在Django中设置和使用Cookie及Session的代码示例分别给出,建议出于安全考虑使用Session。
摘要由CSDN通过智能技术生成

简介

由于http协议的请求是无状态的。故为了让用户在浏览器中再次访问该服务端时,他的登录状态能够保留(也可翻译为该用户访问这个服务端其他网页时不需再重复进行用户认证)。我们可以采用Cookie或Session这两种方式来让浏览器记住用户。

Cookie与Session说明与实现

Cookie

说明

Cookie是一段小信息(数据格式一般是类似key-value的键值对),由服务器生成,并发送给浏览器让浏览器保存(保存时间由服务端定夺)。当浏览器下次访问该服务端时,会将它保存的Cookie再发给服务器,从而让服务器根据Cookie知道是哪个浏览器或用户在访问它。(由于浏览器遵从的协议,它不会把该服务器的Cookie发送给另一个不同host的服务器)。

Django中实现Cookie
from django.shortcuts import render, redirect

# 设置cookie
"""
key: cookie的名字
value: cookie对应的值
max_age: cookie过期的时间
"""
response.set_cookie(key, value, max_age)
# 为了安全,有时候我们会调用下面的函数来给cookie加盐
response.set_signed_cookie(key,value,salt='加密盐',...)

# 获取cookie 
request.COOKIES.get(key)
request.get_signed_cookie(key, salt="加密盐", default=None)

# 删除cookie
reponse.delete_cookie(key)

下面就是具体的代码实现了
views.py

# 编写装饰器检查用户是否登录
def check_login(func):
    def inner(request, *args, **kwargs):
        next_url = request.get_full_path()
        # 假设设置的cookie的key为login,value为yes
        if request.get_signed_cookie("login", salt="SSS", default=None) == 'yes':
            # 已经登录的用户,则放行
            return func(request, *args, **kwargs)
        else:
            # 没有登录的用户,跳转到登录页面
            return redirect(f"/login?next={next_url}")

    return inner


# 编写用户登录页面的控制函数
@csrf_exempt
def login(request):
    if request.method == "POST":
        username = request.POST.get("username")
        passwd = request.POST.get("password")
        next_url = request.POST.get("next_url")

        # 对用户进行验证,假设用户名为:aaa, 密码为123
        if username === 'aaa' and passwd == '123':
            # 执行其他逻辑操作,例如保存用户信息到数据库等
            # print(f'next_url={next_url}')
            # 登录成功后跳转,否则直接回到主页面
            if next_url and next_url != "/logout/":
                response = redirect(next_url)
            else:
                response = redirect("/index/")
            # 若登录成功,则设置cookie,加盐值可自己定义取,这里定义12小时后cookie过期
            response.set_signed_cookie("login", 'yes', salt="SSS", max_age=60*60*12)
            return response
        else:
            # 登录失败,则返回失败提示到登录页面
            error_msg = '登录验证失败,请重新尝试'
            return render(request, "app/login.html", {
   
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值