• COOKIE


    COOKIE介绍

     本质:cookie就是一个键值对,比如自己是一个浏览器,我们要去访问服务器,第一次我们就

    自己去,然后服务器给我们分配了一个键值对,下一次我们再去的时候就带着他可以直接进去,

    (实际上也是验证了),但是前提是我们在特定的时间内去,如果过期了的话那我们就得重新再

    来一遍,就比如我们的淘宝之类的,但是我们很长时间不登录,就要重新登录

    理解COOKIE机制

    cookie机制的基本原理就如同会员卡那样简单,出示会员卡我就按照这个会员卡给你积分,知道你的消费情况不过更有几个问题需要解决:“会员卡”怎么分发;“会员卡”的内容;及客户怎么使用“会员卡”。

      正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特别的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript也能生成cookie。

      而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示,如果某家分店还发行了自己的会员卡,那么进这家店的时候除了要出示麦当劳的会员卡,还要出示这家店的会员卡。

      cookie的内容主要包括:名字,值,过期时间,路径和域。

      其中域能指定某一个域比如.google.com,相当于总店招牌,比如宝洁公司,也能指定一个域下的具体某台机器比如www.google.com或froogle.google.com,能用飘柔来做比。

      路径就是跟在域名后面的URL路径,比如/或/foo等等,能用某飘柔专柜做比。

      路径和域合在一起就构成了cookie的作用范围。

      如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。

      存储在硬盘上的cookie能在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开的窗口上按Ctrl-N(或从文件菜单)打开的窗口能和原窗口共享,而使用其他方式新开的IE进程则不能共享已打开的窗口的内存cookie;对于Mozilla Firefox0.8,所有的进程和标签页都能共享同样的cookie。一般来说是用javascript的window.open打开的窗口会和原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程式研发者造成非常大的困扰。

    cookie初始

    获取Cookie(这些操作都是在Django中进行的)

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

    default  默认值

    salt    加密盐(也就是自己给起个名名字,属于自己的,比较安全)

    max_age    后天控制过期时间,(比如我们一年不登录淘宝的时候,再次打开就需要重新登录,但是经常登录却不需要重复使用用户名和密码,)

    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         超时时间

    path='/',Cookie        生效的路径,/表示根路径,特殊的:根路径的cookie可以被任何url的页面访问

    domain=None          Cookie生效的域名

    secure=False,           http传输

    httponly=False          只能是http协议传输,无法被javascript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

     删除Cookie

    Cookie版的登录校验        

     urls部分

    rom django.conf.urls import url
    # from django.contrib import admin
    
    from app02 import views as v2
    
    urlpatterns = [
      
        url(r'login/$', v2.login),
        url(r'index1/$', v2.index1),
        url(r'index2/$', v2.index2),
    
    ]
    

     views中


    from django.shortcuts import render, redirect # Create your views here. def login(request): if request.method == "POST": user = request.POST.get("user") pwd = request.POST.get("pwd") # 校验用户名密码是否正确 if user == "alex" and pwd == "dashabi": # 登陆成功 rep = redirect("/index1/") # rep.set_cookie("user", user) # import datetime # now = datetime.datetime.now() # d = datetime.timedelta(seconds=10) # rep.set_signed_cookie("user3", user, salt="S8", expires=now+d) rep.set_signed_cookie("user3", user, salt="S8", max_age=100, path="/index1/") return rep return render(request, "login.html") def index1(request): # user = request.COOKIES.get("user") user = request.get_signed_cookie("user3", None, salt="S8") if not user: # 表示没有登录 return redirect("/login/") return render(request, "index1.html", {"username": user}) def index2(request): # user = request.COOKIES.get("user") user = request.get_signed_cookie("user3", None, salt="S8") if not user: # 表示没有登录 return redirect("/login/") return render(request, "index2.html", {"username": user})

    前端部分 

    login

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>登录</title>
    </head>
    <body>
    
    <form action="/login/" method="post">
        {% csrf_token %}
        <input type="text" name="user">
        <input type="password" name="pwd">
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    

    index1 

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>首页</title>
    </head>
    <body>
    <h1>这是index1页面</h1>
    <h1>Hello, {{ username }}</h1>
    </body>
    </html>
    

    index2  

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>首页</title>
    </head>
    <body>
    <h1>这是index2页面</h1>
    <h1>Hello, {{ username }}</h1>
    </body>
    </html>
    

    装饰器版的COOKIE登录校验

    (url、前端和上面COOKIE版的登录校验一样)

    from django.shortcuts import render, redirect
    
    
    # Create your views here.
    def login(request):
        if request.method == "POST":
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            if user == "lanbo" and pwd == "123456":
                rep = redirect("/index/")
                rep.set_signed_cookie("user2", user, salt="a1",max_age=100,path="/index/")
                return rep
    
        return render(request, "login.html")
    
    def auth(func):
        def inner(request,*args,**kwargs):
            user_info = request.get_signed_cookie("user2", None, salt="a1")
            if not user_info:
                return redirect("/login/")
            return func(request,*args,**kwargs)
        return inner
    
    
    @auth
    def index(request):
        user_info = request.get_signed_cookie("user2", None, salt="a1")
    
        return render(request,"index.html",{"username":user_info} )
    
    
    @auth
    def index1(request):
        user_info = request.get_signed_cookie("user2", None, salt="a1")
    
        return render(request,"index1.html",{"username":user_info})
    

      

  • 相关阅读:
    反射/元类/项目的生命周期
    面向对象高级
    面向对象之封装/鸭子类型
    面向对象之继承
    面向对象1
    包/logging模块/hashlib模块/openpyxl模块/深浅拷贝
    python 几行代码实现自动回复功能
    python crypto rsa 加密运用
    pytohn 单下划线与双下划线的区别
    python 线程小练习
  • 原文地址:https://www.cnblogs.com/1996-11-01-614lb/p/8352357.html
Copyright © 2020-2023  润新知