Django的cookie学习

为何要有cookie,由于http是无状态的,每次请求都是独立的,可是咱们还须要保持状态,因此就有了cookiehtml

 

 

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的数据发送给浏览器,让浏览器能够处理;python

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

 

获取cookie数据库

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

  

 

 

能够在服务端操做cookie,也能够在前端页面操做cookiedjango

 

 

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

我开始是这样写的代码后端

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了服务器

 

1、先看下如何在服务端操做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中,能够放到数据库中,可是这样会频繁操做数据库,这样就很差了,咱们有两种方法解决
            # 一、对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是否有值,也能够调用这个装饰器便可

 

 

2、在看下如何在前端页面操做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,老师未讲到,后面我在查下吧

相关文章
相关标签/搜索