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
Django与Cookie的更多相关文章
- Redis+Django(Session,Cookie)的用户系统
一.Django authentication django authentication提供了一个便利的user api接口,无论在py中 request.user,参见Request and re ...
- 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是来自服务端,保存在浏览器的键值对,主要应用于用户登录 ...
- Django实现cookie&session以及认证系统
COOKIE&SESSION 知识储备 由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie的工作原理是:由服务器产生内 ...
- 第4天:Django的cookie和session
Cookie Session Cookie 浏览器请求服务器是无状态的,它的每一次请求对于服务器来说都是新的,服务器默认不会保存用户的状态数据.但很多时候,服务器需要保存用户的一些状态数据,比如用户是 ...
随机推荐
- mysql中source提高导入数据速率的方法
示例: 第一步: 第二步: 使用 source 导入你所需要导入的文件 第三步: 在导入的数据停止后,输入 commit; 这样数据就算是导入完成了.
- 小程序上传base64的图片,可上传多张
微信小程序上传图片转化为base64格式 clickimage: function(e) { var index = e.currentTarget.dataset.index; var count ...
- centos6实现基于google authenticator 的ssh登录二次验证
1.手机安装google身份验证器,在浏览器搜索身份验证器安装即可. centos6安装所需要的软件--- google-authenticator 2.查看这个包生成的所有文件和命令 3.输入goo ...
- [学习笔记] 平衡树——Treap
前置技能:平衡树前传:BST 终于学到我们喜闻乐见的平衡树啦! 所以我们这次讲的是平衡树中比较好写的\(Treap\). (以后会写splay的先埋个坑在这) 好了,进入正题. step 1 我们知道 ...
- HDU 6043 - KazaQ's Socks | 2017 Multi-University Training Contest 1
/* HDU 6043 - KazaQ's Socks [ 找规律 ] | 2017 Multi-University Training Contest 1 题意: 一共 n 双袜子编号 1~n,每天 ...
- Educational Codeforces Round 26 [ D. Round Subset ] [ E. Vasya's Function ] [ F. Prefix Sums ]
PROBLEM D - Round Subset 题 OvO http://codeforces.com/contest/837/problem/D 837D 解 DP, dp[i][j]代表已经选择 ...
- MongoDB——增删改查
文档结构: { "_id": ObjectId("5d5e5de597eb2f0b70005d1a"), , "word_records": ...
- JS转换/Date(-28800000)/格式
去除/Date() if (value.includes('/Date')) { var re = /-?\d+/; value = re.exec(value); value = new Date( ...
- flask框架(一):初入
1.装饰器回顾 # -*- coding: utf-8 -*- # @Author : Felix Wang # @time : 2018/7/3 17:10 import functools &qu ...
- CUDA-F-1-1-异构计算-CUDA
开篇废话 成熟与智慧其实和年龄相关,但绝不是完全由年龄决定,少年老成的人肯定是存在的,不是长得老,而是心态成熟,当然大多数老年人其实有些事情思考起来还是老原则,所以他们有时候做事没那么周到,所以一个人 ...