博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django的cookie学习
阅读量:7073 次
发布时间:2019-06-28

本文共 5554 字,大约阅读时间需要 18 分钟。

为什么要有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

  

被装饰的函数

@outerdef 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的方法

    

  

设置cookie的方法

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

  

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

 

获取cookie

alert($.cookie("name"))

  

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

 

转载于:https://www.cnblogs.com/bainianminguo/p/8850043.html

你可能感兴趣的文章
docker入门之简单的容器使用
查看>>
系统架构相关概念辨析(一)
查看>>
关于java加密
查看>>
thinkphp3.2的行为
查看>>
PHP中使用Redis接管文件存储Session详解
查看>>
前后端如何优化网站性能
查看>>
js bind实现
查看>>
手工安装hadoop ecosystem之疑难杂症
查看>>
数论学习之(一):一元线性同余方程和二元一次不等式
查看>>
SVM-支持向量机算法概述
查看>>
我的友情链接
查看>>
web容器启动时,借助spring进行初始化操作
查看>>
DNS服务器之BIND基础服务部署
查看>>
location
查看>>
Araxis Merge的help
查看>>
通过进程ID得到进程名
查看>>
cacti的基本应用
查看>>
MYSQL错误代码集
查看>>
Centos7 命令总结
查看>>
lufylegend HTML5开源框架基本操作
查看>>