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,老师未讲到,后面我在查下吧
Django的cookie学习的更多相关文章
- Redis+Django(Session,Cookie)的用户系统
一.Django authentication django authentication提供了一个便利的user api接口,无论在py中 request.user,参见Request and re ...
- django form使用学习记录
Django forms使用容易, 又方便扩展, 因此Django admin和CBVs基本都基于forms使用. 事实上, 由于django forms的强大验证功能, 大多数Django API ...
- django处理cookie的机制
title: django处理cookie的机制 tags: djaogo, cookie, session grammar_cjkRuby: true --- cookie的意义 在多数日常使用的网 ...
- Redis+Django(Session,Cookie、Cache)的用户系统
转自 http://www.cnblogs.com/BeginMan/p/3890761.html 一.Django authentication django authentication 提供了一 ...
- web框架开发-Django组件cookie与session
http协议的每一次都是无保存状态的请求,这会带来很多的不方便,比如,一刷新网页,或者进入该网页的其他页面,无法保存之前的登录状态.为了解决类似这样的问题,引入了会话跟踪 会话跟踪技术 1 什么是会话 ...
- Django之Cookie、Session、CSRF、Admin
Django之Cookie.Session.CSRF.Admin Cookie 1.获取Cookie: 1 2 3 4 5 6 request.COOKIES['key'] request.get ...
- python 全栈开发,Day76(Django组件-cookie,session)
昨日内容回顾 1 json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() ...
- [py][mx]django的cookie和session操作-7天免登录
浏览器同源策略(same-origin policy) csrf攻击防御核心点总结 django的cookie和session操作-7天免登录 flask操作cookie&django的see ...
- Django之cookie+session
前言 HTTP协议 是短连接.且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态: cook是来自服务端,保存在浏览器的键值对,主要应用于用户登录 ...
随机推荐
- Codeforces Round #506 D. Concatenated Multiples题解
一.传送门 http://codeforces.com/contest/1029/problem/D 二.题意 给你$N$个数字$a_1,a_2,\cdots,a_n$,一个$K$,求所有$i \ne ...
- 对话框(VC_Win32)
资源描述表中对话框定义 格式: 对话框名 DIALOG[载入特性] X,Y,Width,Height[设置选项] { 对话框控件定义; } 说明: 对话框名称: 标识对话框资源,可为一个字符串也可以为 ...
- android studio 简介 (上)
自从android官方宣布不再提供eclipse adt的更新之后,android studio的推进速度超乎想象得快,不管是github上的源码分享,还是stackoverflow上的问题提问,几乎 ...
- Distill详述「可微图像参数化」:神经网络可视化和风格迁移利器!
近日,期刊平台 Distill 发布了谷歌研究人员的一篇文章,介绍一个适用于神经网络可视化和风格迁移的强大工具:可微图像参数化.这篇文章从多个方面介绍了该工具. 图像分类神经网络拥有卓越的图像生成能力 ...
- python学习之----用虚拟环境保存库文件
如果你同时负责多个Python 项目,或者想要轻松打包某个项目及其关联的库文件,再 或者你担心已安装的库之间可能有冲突,那么你可以安装一个Python 虚拟环境来分而 治之. 当一个Python 库不 ...
- HTML|CSS之前端入门
知识内容: 1.计算机网络综述 2.web基础 3.HTML与CSS介绍 4.JavaScript与jQuery介绍 一.计算机网络综述 1.什么是计算机网络 计算机网络是指将地理位置不同.具有独立功 ...
- css的样式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- c++官方文档-指针
#include<stdio.h> #include<iostream> #include<queue> #include<map> #include& ...
- 【独家】完美解决appium安装app时,需要手动确认安装的问题
appium初始化driver时,如果未安装该app会先进行安装,安装时,很多安卓手机都会弹框,需要手动确认安装. 如小米的机器, 这是个头疼的问题,之前在网上找遍了,只有通过adb去点相对坐标成功了 ...
- HTML5 监听移动端浏览器返回键兼容版本
// 往windosw对象中的历史记录注入URL的方法 function addUrl() { var state = { title: "title", url: "# ...