zoukankan      html  css  js  c++  java
  • Django基础之cookie

    1. Cookie

    1.1 Cookie的由来

    大家都知道HTTP协议是无状态的。无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系, 它不会受前面的请求响应情况直接影响, 也不会直接影响后面的请求响应情况。

    一句话来概括, 对于服务器来说, 每次的请求都是全新的。

    状态可以理解为客户端和服务器在每次会话中产生的数据, 那无状态的就以为这些数据不会被保留. 会话中产生的数据又是我们需要保存的, 也就是说要"保持状态". 因此Cookie就是在这样一个场景下诞生。

    1.2 什么是Cookie

    Cookie具体指的是一段小信息, 它是服务器发送出来存储在浏览器上的一组组键值对, 下次访问服务器时浏览器会自动携带这些键值对, 以便服务器提取有用的信息。

    1.3 Cookie的原理

    cookie的工作原理是: 由服务器产生内容, 浏览器收到请求后保存在本地; 当浏览器再次访问时, 浏览器会自动带上Cookie, 这样服务器就能通过Cookie的内容来判断这个是"谁"了。

    1.4 查看Cookie

    我们使用Chrome浏览器, 打开开发者工具.。

    2. Django中操作Cookie

    2.1 获取cookie

    request.COOKIES["key"]
    request.get_signed_cookie("key", default=RAISE_ERROR, salt="", max_age=None)
    

    get_signed_cookie方法的参数:

    • default默认值
    • salt: 加密盐
    • max_age: 后台控制过期时间

    2.2 设置Cookie

    rep = HttpResponse(...)
    rep = render(request, ...)
    
    rep.set_cookie(key, value, ...)
    rep.set_signed_cookie(key, value, salt="加密盐", ...)
    

    参数:

    key      键
    value=""    值
    max_age=None 超时时间
    expires=None 超时时间(IE requires expores, so set it if hasn't been already)
    path="/" cookie生效的路径, /表示根路径, 特殊的: 根路径的cookie可以被任何url的页面访问
    domain=None Cookie生效的域名
    secure=False https传输
    httponly=False 只能http协议传输, 无法被JavaScript获取(不是绝对, 底层抓包可以获取到也可以被覆盖)
    

    2.3 删除cookie

    def logout(request):
        rep = redirect("/login/")
        rep.delete_cookie 
    

    3. Cookie版登录校验

    from django.shortcuts import render, redirect, HttpResponse
    
    
    def login_required(func):
        def inner(request, *args, **kwargs):
            return_url = request.path_info
            print(return_url)
            if request.COOKIES.get("is_login") == "True":
                print("cookies true")
                ret = func(request, *args, **kwargs)
                return ret
            else:
                return redirect("/login/?ReturnUrl={}".format(return_url))
    
        return inner
    
    
    def login(request):
        err_msg = ""
        if request.method == "POST":
            username = request.POST.get("username")
            password = request.POST.get("password")
            print(username, password)
            if username == "yang" and password == "123":
                return_url = request.GET.get("ReturnUrl", "")
                if return_url:
                    ret = redirect(return_url)
                else:
                    ret = redirect("/index/")
                ret.set_cookie("is_login", "True", max_age=604800)
                return ret
            else:
                err_msg = "用户名或者密码错误"
        return render(request, "login.html", {"err_msg": err_msg})
    
    
    @login_required
    def index(request):
        return render(request, "index.html")
    
    @login_required
    def home(request):
        return HttpResponse("这是home页面")
    
    @login_required
    def logout(request):
        rep = redirect("/login/")
        rep.delete_cookie("is_login")
        return rep
    

      

     
  • 相关阅读:
    Java学习笔记二:发展史之Java的发展
    Java学习笔记一:发展史之Java诞生前
    JPA学习笔记四:理论篇之CRUD
    JPA学习笔记二:实践篇之SpringBoot集成JPA
    JPA学习笔记一:理论篇之JPA介绍
    JPA学习笔记三:实践篇之实现正向工程
    MySQL:大表优化
    如何理解原型链中的prototype和__proto__?
    Node版本的升级和降级
    常用的git提交代码命令
  • 原文地址:https://www.cnblogs.com/yang-wei/p/9998050.html
Copyright © 2011-2022 走看看