cookie和session

一. cookie

  1. cookie的由来

    由于HTTP协议是无状态的,所以每次请求的时候都是全新的,但是有些数据是需要保留的(帐号密码),所以出现了cookie.

  2. cookie的原理及作用

    cookie可以保存在本地(键值对保存),用户每次去请求的时候都带着数据,这样就不需要用户每次都输入数据了.

  3. cookie中的方法

    response.set_cookie("key","value")  需要在响应对象上设置

    response.set_signed_cookie("key","value",salt="")  加盐版的

    request.COOKIES      获取到的是字典形式的对象,可以使用字典的方法操作

    request.get_signed_cookie()   获取加盐版的cookie

    response.delete_cookie("key") 删除cookie

  4. cookie版的登陆

cookie版
def login(request):

    if request.method == "GET":
        return render(request, "login.html")

    else:
        username = request.POST.get("username")
        password = request.POST.get("password")
        ret = models.UserInfo.objects.filter(username=username, password=password)

        if ret.exists():
            cookie_obj = request.COOKIES
            # print(cookie_obj)   # {'csrftoken': 'YpOTG4x5A4NVRJb45PCmeDpPxVUEKV6wLJgUxBnQBdTnrb0PQp0JlKqWAAPd3Hkx'}

            ret = redirect(reverse("home"))
            # ret.set_cookie("is_login", True, max_age=10)    # max_age 是过多久清空这个cookie,默认14天
            ret.set_signed_cookie("is_login", True, salt="hhh")  # 加盐版
            # print(ret)  # <HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/home">
            return ret
        else:
            return render(request, "login.html")



def home(request):

    is_login = request.COOKIES.get("is_login", False)  # cookie里面存的是字符串类型的
    # is_login = request.get_signed_cookie("is_login", False, salt="hhh")  # 过去加盐版的

    # print(is_login, type(is_login))     # True <class 'str'> 这是登陆时的
    # print(is_login, type(is_login))     # True:1h2D76:1avfdKMi4-9eedxyPi4RgcRLCP0 <class 'str'>  加盐版的

    if not is_login:        # 因为登陆成功返回的不是bool而是一个字符串,所以判断没有登陆的状态
        return redirect("login")

    else:
        return render(request, "home.html")
cookie版

二. session

  1. session的由来

    由于cookie最大支持409kb,并且存在客户端的,不安全,所以有了session,它支持更多字节,并且存在服务器.

  2. session的原理

    用户每次请求的时候都带着一个sessionid,服务器收到后使用sessionid识别拿对应的数据,一个浏览器对应一个sessionid.

  3. session中的方法

    request.session        获取session对象,跟字典一样

    request.session.get("key",None) 获取session中的key

    del request.session["key"]    删除session

    request.session.delete()     删除当前会话的session

    request.session.flush()      删除当前会话数据并删除cookie

    request.session.set_expiry(value) value是整数时,就是在多少秒后失效,为0时,关闭浏览器就失效

  4. session版的登陆

def login(request):

    if request.method == "GET":
        return render(request, "login.html")

    else:
        username = request.POST.get("username")
        password = request.POST.get("password")
        ret = models.UserInfo.objects.filter(username=username, password=password)

        if ret.exists():
            request.session.setdefault("username", username)    # 给session添加键值
            request.session["is_login"] = True

            return redirect(reverse("home"))

        else:
            return render(request, "login.html")

# 装饰器验证登陆
def session(fn):
    def inner(request, *args, **kwargs):
        is_login = request.session.get("is_login", False)
        if is_login:
            ret = fn(request)
            return ret
        else:
            return redirect(reverse("login"))
    return inner
session版
原文地址:https://www.cnblogs.com/q767498226/p/10520582.html