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的更多相关文章

  1. Redis+Django(Session,Cookie)的用户系统

    一.Django authentication django authentication提供了一个便利的user api接口,无论在py中 request.user,参见Request and re ...

  2. django处理cookie的机制

    title: django处理cookie的机制 tags: djaogo, cookie, session grammar_cjkRuby: true --- cookie的意义 在多数日常使用的网 ...

  3. Redis+Django(Session,Cookie、Cache)的用户系统

    转自 http://www.cnblogs.com/BeginMan/p/3890761.html 一.Django authentication django authentication 提供了一 ...

  4. web框架开发-Django组件cookie与session

    http协议的每一次都是无保存状态的请求,这会带来很多的不方便,比如,一刷新网页,或者进入该网页的其他页面,无法保存之前的登录状态.为了解决类似这样的问题,引入了会话跟踪 会话跟踪技术 1 什么是会话 ...

  5. Django之Cookie、Session、CSRF、Admin

    Django之Cookie.Session.CSRF.Admin   Cookie 1.获取Cookie: 1 2 3 4 5 6 request.COOKIES['key'] request.get ...

  6. python 全栈开发,Day76(Django组件-cookie,session)

    昨日内容回顾 1 json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() ...

  7. [py][mx]django的cookie和session操作-7天免登录

    浏览器同源策略(same-origin policy) csrf攻击防御核心点总结 django的cookie和session操作-7天免登录 flask操作cookie&django的see ...

  8. Django之cookie+session

    前言 HTTP协议 是短连接.且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态: cook是来自服务端,保存在浏览器的键值对,主要应用于用户登录 ...

  9. Django实现cookie&session以及认证系统

    COOKIE&SESSION 知识储备 由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie的工作原理是:由服务器产生内 ...

  10. 第4天:Django的cookie和session

    Cookie Session Cookie 浏览器请求服务器是无状态的,它的每一次请求对于服务器来说都是新的,服务器默认不会保存用户的状态数据.但很多时候,服务器需要保存用户的一些状态数据,比如用户是 ...

随机推荐

  1. springmvc后台获取表单提交的数据——@ModelAttribute等方式

    1.通过注解ModelAttribute直接映射表单中的参数到POJO.在from中的action写提交的路径,在input的name写参数的名称. package com.demo.model; p ...

  2. electron-vue 引入OpenLayer 报错 Unexpected token export

    electron-vue 引入OpenLayer 报错 Unexpected token export 解决办法: 在 .electron-vue/webpack.renderer.config.js ...

  3. H5 设计尺寸

    750*1218 微信下 兼容 7plus 内容高度 居中 1000px 内 750*1448 微信下 兼容 iphoneX 微信导航栏高度 64px 64px =  导航栏44+状态栏20 但是现在 ...

  4. ZOJ - 3591 NIM

    ZOJ - 3591NIM 题目大意:给你n,s,w和代码,能生成长度为n的序列,问异或和不为0的子序列有多少个? 这是个挂羊头卖狗肉的题,和NIM博弈的关系就是要异或和不为0,一开始以博弈甚至循环节 ...

  5. Miller Robin大素数判定

    Miller Robin算法 当要判断的数过大,以至于根n的算法不可行时,可以采用这种方法来判定素数. 用于判断大于2的奇数(2和偶数需要手动判断),是概率意义上的判定,因此需要做多次来减少出错概率. ...

  6. js基础( js嵌入方式、输出语句)

    s现在的作用 1.验证表单(以前的网速慢)  2.页面特效 (PC端的网页效果)  3.移动端 (移动 web 和app)  4.异步和服务器交互(ajax)  5.服务器端开发 (nodejs)   ...

  7. 安装lanproxy服务端、客户端以及小问题解决

    准备 我们这里使用java客户端与服务端连接 1.一台公网服务器(运行proxy-server).2.一台内网客户端(运行proxy-client). 下载地址:https://seafile.cdj ...

  8. linux开机执行脚本

    有些服务用命令启动的想要做到开机启动可以 /etc/profile.d/ 下面建一个脚本文件(这个目录优先级最低) #!/bin/bash ... 转载请注明博客出处:http://www.cnblo ...

  9. 使用Grizzy+Jersey搭建一个RESTful框架()报错Exception in thread "main" java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;

    报错的类涉及UriBuilder,我搜索类发现, 这个类存在于两个包中,我在baidu的时候,也有人提到是jar包冲突,我就删除了 这个依赖,问题解决了. 环境搭建过程请见地址https://blog ...

  10. 【React自制全家桶】七、React实现ajax请求以及本地数据mock

    一.下载axios插件 yarn add axios 二.React的ajax请求代码如何放置 建议放置在生命周期函数之componentDidMount()中 三.ajax之get请求 axios. ...