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. 通过CSS实现 文字渐变色 的两种方式

    说明 这次的重点就在于两个属性, background 属性 mask 属性这两个属性分别是两种实现方式的关键. 方式一 解释 <!DOCTYPE html> <html> & ...

  2. Hibernate的CRUD配置及简单使用

    参考博客:https://blog.csdn.net/qq_38977097/article/details/81326503 1.首先是jar包,可以在官网下载. 或者点击下面链接下载 链接:htt ...

  3. 处理springboot OTS parsing error: Failed to convert WOFF 2.0 font to SFNT

    springboot项目中添加了字体等文件后,页面无法识别,浏览器调试窗口报错如下: Failed to decode downloaded font: http://localhost:8080/f ...

  4. uniapp在在页面跳转时,若URL太长的字符串会导致数据传递失败

    url有长度限制,太长的字符串会传递失败,可使用窗体通信.全局变量,或encodeURIComponent等多种方式解决,如下为encodeURIComponent示例的解决方法. <navig ...

  5. 【Python之路】特别篇--Bottle

    Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. Bottle框架大致可以分为以下部分 ...

  6. CSS的水平居中和垂直居中

    水平居中如果不太熟悉盒子模型的话属实不太好理解,其实就是控制其他属性来让border之内的内容被控制在父容器中间就行了,最经典的就是使用{margin: 0  auto}了,控制其上下外边框为0,左右 ...

  7. 51 Nod 1092 回文字符串

    1092 回文字符串  基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串.每 ...

  8. noi.ac #528 神树和排列

    题目链接:戳我 #include<iostream> #include<cstring> #include<cstdio> #include<algorith ...

  9. CodeForces–830A--二分,贪心

    Office Keys time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  10. [spring cloud] [error] java.lang.IllegalStateException: Only one connection receive subscriber allowed.

    前言 最近在开发api-gateway的时候遇到了一个问题,网上能够找到的解决方案也很少,之后由公司的大佬解决了这个问题.写下这篇文章记录一下解决方案.希望可以帮助到更多的人. 环境 java版本:8 ...