session和cookie

Posted qwer-123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了session和cookie相关的知识,希望对你有一定的参考价值。

from django.shortcuts import render, redirect
from django import views

# Create your views here.
from functools import wraps
# Django提供的工具,把函数装饰器转变成方法装饰器
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt, csrf_protect


def check_login(func):
    @wraps(func)  # 装饰器修复技术
    def inner(request, *args, **kwargs):
        ret = request.session.get("is_login")
        # 1. 获取cookie中的随机字符串
        # 2. 根据随机字符串去数据库取 session_data --> 解密 --> 反序列化成字典
        # 3. 在字典里面 根据 is_login 取具体的数据
        if ret == "1":
            # 已经登陆过的 继续执行
            return func(request, *args, **kwargs)
        # 没有登录过的 跳转到登录页面
        else:
            # 获取当前访问的URL
            next_url = request.path_info
            print(next_url)
            return redirect("/login/?next={}".format(next_url))
    return inner


@csrf_exempt
def login(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        # 从URL里面取到 next 参数
        next_url = request.GET.get("next")

        if user == "alex" and pwd == "dsb":
            # 登陆成功
            # 告诉浏览器保存一个键值对

            if next_url:
                rep = redirect(next_url)  # 得到一个响应对象
            else:
                rep = redirect("/home/")  # 得到一个响应对象
            # 设置session
            request.session["is_login"] = "1"
            request.session["name"] = user
            request.session.set_expiry(7)  # 7秒钟之后失效
            return rep

    return render(request, "login.html")


@check_login
def home(request):
    user = request.session.get("name")
    return render(request, "home.html", {"user": user})


@check_login
def index(request):

    return render(request, "index.html")


# 注销函数
def logout(request):
    # 只删除session数据
    # request.session.delete()
    # 如何删除session数据和cookie
    request.session.flush()
    return redirect("/login/")


# @method_decorator(check_login, name="get")
class UserInfo(views.View):

    @method_decorator(check_login)
    def get(self, request):
        return render(request, "userinfo.html")
from django.shortcuts import render, redirect

# Create your views here.
from functools import wraps


def check_login(func):
    @wraps(func)  # 装饰器修复技术
    def inner(request, *args, **kwargs):
        ret = request.get_signed_cookie("is_login", default="0", salt="s10nb")
        if ret == "1":
            # 已经登陆过的 继续执行
            return func(request, *args, **kwargs)
        # 没有登录过的 跳转到登录页面
        else:
            # 获取当前访问的URL
            next_url = request.path_info
            print(next_url)
            return redirect("/login/?next={}".format(next_url))
    return inner


def login(request):
    print(request.get_full_path())  # 获取当前请求的路径和参数
    print(request.path_info)  # 取当前请求的路径
    print("-" * 120)

    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        # 从URL里面取到 next 参数
        next_url = request.GET.get("next")

        if user == "alex" and pwd == "dsb":
            # 登陆成功
            # 告诉浏览器保存一个键值对

            if next_url:
                rep = redirect(next_url)  # 得到一个响应对象

            else:
                rep = redirect("/home/")  # 得到一个响应对象

            # rep.set_cookie("is_login", "1")
            # 设置加盐的cookie
            rep.set_signed_cookie("is_login", "1", salt="s10nb", max_age=10)  # 单位是秒
            return rep

    return render(request, "login.html")


def home(request):
    # 从请求的cookie中找 有没有 xiaohei
    # ret = request.COOKIES.get("is_login", 0)
    # 取加盐过的
    ret = request.get_signed_cookie("is_login", default="0", salt="s10nb")
    print(ret, type(ret))
    if ret == "1":
        # 表示已经登陆过
        return render(request, "home.html")
    else:
        return redirect("/login/")

@check_login
def index(request):

    return render(request, "index.html")


# 注销函数
def logout(request):
    # 如何删除Cookie
    rep = redirect("/login/")
    rep.delete_cookie("is_login")
    return rep

以上是关于session和cookie的主要内容,如果未能解决你的问题,请参考以下文章

少部分手机浏览器对于COOKIE支持不够导致服务端无法读取session的解决方案

Cookie和Session的工作流程及区别(附代码案例)

cookie和session

cookie和session

cookie和session

会话技术知识点整理(Cookie和Session)