zoukankan      html  css  js  c++  java
  • Django的cookie学习

    为什么要有cookie,因为http是无状态的,每次请求都是独立的,但是我们还需要保持状态,所以就有了cookie

    cookie就是保存在客户端浏览器上的键值对,别人可以利用他来做登陆

                rep = redirect("/app1/index/")
                rep.set_signed_cookie("user_name",db_name,max_age=600)
                rep.set_signed_cookie("user_pwd", db_pwd, max_age=600)
    

    这里为什么要通过redirect去设置cookie吗?是因为cookie是保存在客户端的浏览器上的,通过redirect向客户端返回数据,顺便把cookie的数据发送给浏览器,让浏览器可以处理;

    那么,是否只能通过redirect向客户端发送cookie,之前是这样认为的,其实这是错误的,通过Httpresponse和render都可以向客户端发送数据,他们也可以携带cookie给客户端浏览器

    获取cookie

        cookie_name = request.get_signed_cookie("user_name",None)
        cookie_pwd = request.get_signed_cookie("user_pwd",None)
    

      

    可以在服务端操作cookie,也可以在前端页面操作cookie

    今天写代码发现一个错误,可以更好的体现cookie是放在客户端浏览器上

    我开始是这样写的代码

            if db_name == input_name and db_pwd == input_pwd:
    
                rep = redirect("/app1/index")
                rep.set_signed_cookie("username",db_name,max_age=600)
                rep.set_signed_cookie("userpwd", db_pwd, max_age=600)
    
                
                error_dict = {"error": "用户名或者密码错误", "status": "success"}
                rep = HttpResponse(json.dumps(error_dict))
                return rep
    

      

    我用redirect的对象设置cookie,但是最后return的时候是return的Httpresponse,我这样的写,后面怎么也获取不到cookie,原来这里仅仅是设置了cookie,但是没有使用return返回,也就是没有发给客户端,后面我一直获取cookie却获取不到,原因就是cookie压根就没有发给客户端,当然就获取不到cookie了,后面我将代码修改为下面的,就可以获取到了

            if db_name == input_name and db_pwd == input_pwd:
    
                # rep = redirect("/app1/index")
                error_dict = {"error": "用户名或者密码错误", "status": "success"}
                rep = HttpResponse(json.dumps(error_dict))
                rep.set_signed_cookie("username",db_name,max_age=600)
                rep.set_signed_cookie("userpwd", db_pwd, max_age=600)
    
    
                return rep
    

      

    用Httpresponse的对象去设置cookie,然后也return返回Httpsponse的对象,最后在客户端就可以正常的获取的cookie了

    一、先看下如何在服务端操作cookie

    设置cookie,在视图函数中,redirect方法返回的对象中可以设置cookie,使用set_cookie设置不加密的cookie,使用set_signed_cookie设置加密的cookie,其中的各种参数具体代码中的描述

     rep = redirect("/user_manager_app1/index/")
                rep.set_cookie("username",user_name,path="/test/")
                print("用户名------------->", user_name)
                print("用户名------------->", user_pwd)
                # rep.set_cookie("username", user_name, max_age=10, path="/")
                rep.set_cookie("username", user_name, path="/test/", domain="www.oldboy.com",secure=False,httponly=False)
                rep.set_signed_cookie()
                # 设置cookie,通过键值对设置cookie
                # max_age值的10的意思10秒钟后自动消失,就是超时时间
                # path的意思是我访问哪个url才能访问到这个cookie,默认path="/",意思是访问任何url都可以获取到
                # domain的意思是访问哪个域名才能访问到这个cookie,且你只能设置自己的域名,你不能设置别人的domin的域名
                # secure的如果为false则不需要证书,意思就是用http访问,但是如果设置为true,则意思是需要证书,意思是通过https访问
                # httponly的意思只能通过http协议网络传输才能用这个cookie,如果通过js是不能使用的这个cookie
    
                # 敏感信息不能放在cookie中,可以放到数据库中,但是这样会频繁操作数据库,这样就不好了,我们有两种方法解决
                # 1、对cookie进行加密,使用rep.set_signed_cookie()进行设置加密后的cookie,这样的话,我们在取cookie的时候也需要
                # 切换方法,使用request.get_signed_cookie()去获取cookie
                #
                # 将不敏感的信息放在cookie中,用加密的方式,然后将敏感的信息放在数据库中,做到敏感信息不外露,但是会加重服务器的负担
    

      

    我们一般需要对cookie加盐,为了防止被破解

            if name == "cui" and pwd == "123":
    
                rep = redirect("/app1/home/")
    
    
                rep.set_signed_cookie("cookie_name",name,salt="gg")
                rep.set_signed_cookie("cookie_pwd", pwd,salt="pp")
                # rep.set_cookie()
    
                return rep
    

    salt就是加盐

    同样,如果我们想取cookid,也需要加盐才能取出来

    def home(request):
        cookie_name = request.get_signed_cookie("cookie_name",None,salt="gg")
        cookie_pwd = request.get_signed_cookie("cookie_pwd",None,salt="pp")
        # cccc = request.COOKIES.get()
        print(cookie_pwd,cookie_name,"----------------")
        if cookie_name == "cui" and cookie_pwd == "123":
            return render(request,"home.html")
        else:
            return redirect("/app1/login/")
    

      

      

    如何取出cookie,在视图函数中的request使用request.COOKIES.get可以获取不加密的cookie,使用request.get_signed_cookie去获取加密的cookie

    def index(request):
        # 如果用已经登录,获取当前登录的用户名,否则返回到登录页面
        u_name = request.COOKIES.get("username")
        # u_name = request.get_signed_cookie()
        if u_name:
            return render(request,"index.html",{"user_name":u_name})
        else:
            return redirect("/user_manager_app1/login/")
    

      

    在django中一般这样使用cookies,我们一般会把获取cookies放在一个装饰器函数中,然后每个函数用这个装饰器函数装饰就可以了

    def outer(func):
        def innder(request):
            try:
                user_name = request.get_signed_cookie("username")
                user_pwd = request.get_signed_cookie("userpwd")
                if user_name == "admin" and user_pwd == "admin123.":
                    rep = func(request)
                    return rep
            except Exception as e:
                print(e)
                return redirect("/app1/login")
        return innder
    

      

    被装饰的函数

    @outer
    def index(request):
        # user_name = request.COOKIES.get("username")
        user_name = request.get_signed_cookie("username")
        return render(request,"index.html",{"username":user_name})
    

      

    我们在urls中的信息

    urlpatterns = [
        # path('test1/', views.test1),
        # path('many_to_many_func/', views.many_to_many_func),
        path('test/', views.test),
        path('register/', views.register),
        path('login/', views.login),
        path('index/', views.index),
    
    ]
    

      

    在路由匹配中,执行index函数,其实就是在执行innder函数,因为装饰器函数的outer返回的值是innder函数的地址,装饰器函数outer接受一个参数func,而这个func就是原来的index的地址,所有我们最后实现一个在执行index函数之前,先去cookies中判断是否有值,且值是否符合我们要求的目的,其他函数如果需要判断cookies是否有值,也可以调用这个装饰器即可

    二、在看下如何在前端页面操作cookie

    在前端操作cookie最好导入一个jquery的一个插件,这个插件可以更好的操作cookie,插件的名字是“jquery.cookie.js”

    首先需要导入jquery,然后在导入jquery.cookie.js,才能是一共jqury的cookie的方法

        <script src="/static/jquery-3.3.1.js"></script>
        <script src="/static/jquery.cookie.js"></script>
    

      

    设置cookie的方法

            $.cookie("name","age",{"path":"/"});
    {#        在前端和后端设置cookie和断后端的参数都是一样的,cookie只保存在客户端上#}
    

      

    前端设置cookie和后端的参数完全一样的

    获取cookie

    alert($.cookie("name"))
    

      

    在前端如果操作加密和cookie,老师未讲到,后面我在查下吧

  • 相关阅读:
    BZOJ 1191 HNOI2006 超级英雄hero
    BZOJ 2442 Usaco2011 Open 修建草坪
    BZOJ 1812 IOI 2005 riv
    OJ 1159 holiday
    BZOJ 1491 NOI 2007 社交网络
    NOIP2014 D1 T3
    BZOJ 2423 HAOI 2010 最长公共子序列
    LCA模板
    NOIP 2015 D1T2信息传递
    数据结构
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/8850043.html
Copyright © 2011-2022 走看看