zoukankan      html  css  js  c++  java
  • Django与Cookie

    Cookie

    Cookie的由来

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

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

    什么是Cookie

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

    Cookie的原理

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

    Cookie的应用

    • 登录
    • 投票
    • 记录网页的浏览习惯

    Django中设置Cookie

    在response响应上再加一层cookie头

    rep = HttpResponse(...)
    rep = render(request, ...)
    
    rep.set_cookie(key,value,...)  # 设置普通cookie
    rep.set_signed_cookie(key,value,salt='加密盐',...)  # 设置加密cookie
    

    【参数说明】

    • key ,设置键
    • value='', 设置值
    • max_age=None, 设置超时时间,超时后cookie失效,默认是关闭浏览器失效
    • expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
    • path='/', Cookie生效的路径,/ 表示根路径,默认情况下是根路径,特殊的:根路径的cookie可以被任何url的页面访问;如果设定好路径,就只能去到该路径了
    • domain=None, Cookie生效的域名
    • secure=False, https传输
    • httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

    【示例】

    def login(request):
    
        if request.method == "POST":
            user = request.POST.get('user')
            pwd = request.POST.get("pwd")
            if user == 'gailun' and pwd == '12345':
                # 校验成功,设置登陆状态
                ret = redirect("/home/")
                ret.set_cookie('status','1')  # 1 表示登陆成功
                return ret
            else:
                error = '用户名或密码错误'
                return render(request,'login.html',{"error":error})
        return render(request,'login.html')
    

    chrome浏览器打开开发者工具,在network选项卡下可以查看cookies

    Django中获取Cookie

    request.COOKIES.get(‘key’,none)
    或者根据键值对的特点用key找value
    request.COOKIES['key']   
    
    request.get_signed_cookie('key', default=RAISE_ERROR, salt='', max_age=None)  #default也可以改为'',获取不到值的时候就不会报错了
    

    【get_signed_cookie方法的参数说明】

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

    Django中删除Cookie

    rep = render(request, ...)
    rep.delete_cookie('key')
    

    【案例】

    def check(func):  # 装饰器,登陆验证
        # 读取cookie
        def inner(request,*args,**kwargs):
            # status = request.COOKIES.get("status")
            status = request.get_signed_cookie('status',default='Error',salt='jjzz')
            if status != '1':
                return redirect(f"/login/?returnurl={request.path_info}")   # request.path_info当前访问的地址
            else:
                ret = func(request,*args,**kwargs)
                return ret
        return inner
    
    def login(request):
    
        if request.method == "POST":
            user = request.POST.get('user')
            pwd = request.POST.get("pwd")
    
            if user == 'gailun' and pwd == '12345':
                info = request.GET.get("returnurl")
                # 校验成功,设置登陆状态
                if info:
                    ret = redirect(f"{info}")  # request.path_info获取的地址是含有//的
                else:
                    ret = redirect("/home/")
    
                # ret.set_cookie('status','1')  # 1表示登陆成功
                ret.set_signed_cookie('status','1','jjzz')
                return ret
            else:
                error = '用户名或密码错误'
                return render(request,'login.html',{"error":error})
        return render(request,'login.html')
    
    @check
    def home(request):
        return  HttpResponse("welcome to home page")
    
    @check
    def index(request):
        return  HttpResponse("welcome to index page")
    
    @check
    def logout(request):
        ret = redirect("/login/")
        ret.delete_cookie('status')
        return ret
    
  • 相关阅读:
    javaWeb下载
    javaWeb上传
    JavaWeb过滤器
    JavaWeb中的监听器
    数据库dbutils
    数据库连接池
    51nod 1837 砝码称重【数学,规律】
    Codeforces Round #437 (Div. 2)[A、B、C、E]
    Codeforces Round #436 (Div. 2)【A、B、C、D、E】
    Codeforces Round #435 (Div. 2)【A、B、C、D】
  • 原文地址:https://www.cnblogs.com/jjzz1234/p/11619910.html
Copyright © 2011-2022 走看看