18-cookie 和 session

发布时间 2023-03-28 18:40:39作者: 测试圈的彭于晏

1. cookie操作

# 增加 : response.set_cookie("username", user.username, expires=future)
# 获取 : username = request.COOKIES.get("username")
# 删除 : res.delete_cookie("username")

1.1 登录-首页-退出登录

def login(request):
    if request.method == "POST":
        userinfo = request.POST.dict()
        userinfo.pop("csrfmiddlewaretoken")
        print(userinfo)
        # user = User.objects.filter(**userinfo).first()
        user = User.objects.filter(username=userinfo.get("username"), password=userinfo.get("password")).first()
        if user:
            response = redirect('/user/') # 重定向到首页
            # 三天以后过期
            future = datetime.now() + timedelta(days=3)
            # 将cookie值写回客户端
            response.set_cookie("username", user.username, expires=future)
            return response

    return render(request, 'app03/login.html')


def home(request):
    # 获取cookie中指定键值对
    username = request.COOKIES.get("username")
    return render(request, "app03/index.html", locals())


def logout(request):
    res = redirect('/user/')
    res.delete_cookie("username")
    return res

# urls.py
app_name='App03'
urlpatterns = [
    path('login/',views.login,name="login"),
    path('',views.home,name="home"),
    path('logout/',views.logout,name="logout"),
]
# 登录页面
<body>
<form action="{% url 'App03:login' %}" method="post">
    {% csrf_token %}
    用户名:<input type="text" name="username"> <br>
    密码:<input type="password" name="password"> <br>
    <input type="submit">
</form>
</body>
# 首页
<body>
<h1>首页</h1>
{% if username %}
    {{ username }} &nbsp;<a href="/user/logout/">退出登录</a>
{% else %}
    你还未登录
{% endif %}
</body>

1.2 路由保护

# 验证是不是登录状态,没登录跳登录页
# 自定义装饰器:路由保护
def check_login(func):
    def inner(*args, **kwargs):
        if args[0].COOKIES.get("username"):
            return func(*args, **kwargs)
        else:
            return redirect("/user/login")
    return inner


@check_login
def list_article(request):
    return HttpResponse("文章列表")

   # 路由保护
    path("list/",views.list_article,name="list"),

2. session操作

# 增加 : request.session["username"] = user.username
# 获取 : username = request.session.get("username")
# 删除 : 
   request.session.clear()  # 清除所有session键值对,不清空sessionid
   request.session.flush()  # 清除所有session键值对,并清空sessionid,并清空数据库对应的记录
   del request.session["username"]  # 清除指定session键值对
# 和上述操作cookie一致