cookie

Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息

我理解的cookie就是服务器端在用户浏览器中写下的信息,用来存储用户当前的状态或该用户相关的信息,如是否已经登录。
使用cookie的原因:HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。

在Django中使用cookie

一个用户登录的例子:
用户登录后,在其浏览器中写入username键值对,并在其他页面判断是否有username


class login(views.View):
def get(self,req,*args,**kwargs):
return render(req, "app1/login.html", {'massage': ''}) def post(self,req,*args,**kwargs):
user = req.POST.get('user')
pwd = req.POST.get('pwd')
c = models.Administrator.objects.filter(username=user, password=pwd).count()
if c > 0:
rep = redirect('/index/')
newuser = user.encode('utf-8').decode('latin-1')
rep.set_cookie('username', newuser, max_age=10)
return rep
else:
massage = '用户名或密码错误'
return render(req, "app1/login.html", {'massage': massage}) def index(req):
username=req.COOKIES.get('username')
if username:
newuser=username.encode('latin-1').decode('utf-8')
return render(req, "app1/index.html", {"name": newuser})
return redirect("/login")

查看set_cookie参数


def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
domain=None, secure=False, httponly=False, samesite=None):
  • key :键
  • value :值
  • max_age :cookie的生效时间
  • expires :cookie的具体过期时间
    它和max_age功能类似,如果不设置expires,函数会根据max_age自动设置expires,原因是ie浏览器需要expires
  • path :指定那个url可以访问到cookie,默认为’/‘,表示所有url
  • domain :指定那个域名以及它下面的子域名可以访问这个cookie,默认为当前域名
  • secure :https安全相关,当secure属性设置为true时,cookie只有在https协议下才能上传到服务器,而在http协议下是没法上传的
  • httponly :限制只能通过http传输,JS无法在传输中获取和修改
  • samesite :好像是2.1中的新功能,此标志可防止cookie在跨站点请求中发送,从而防止CSRF攻击并使某些方法无法窃取会话cookie。None表示不适用此标志,还有Strict与Lax参数,具体查看https://docs.djangoproject.com/en/2.1/ref/settings/#std:setting-SESSION_COOKIE_SAMESITE

删除cookie

response.delete_cookie('key')

session

session本意为开会,会议,在这里我们可以叫它会话,既然是会话,那么就是一段时间的交流,交流的状态就需要保持着。
对于cookie来说,数据或者用户相关信息是存放在客户的浏览器上,这样导致你的相关信息容易被暴露,让别人更容易进行cookie欺骗,如果可以将相关信息存放到服务器端,那么这种风险就会相对较低一些。使用的方式就是session
客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上叫做session,当客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。客户端识别是哪一个用户的方式为为其分配一个SessionId。
session内部也是通过cookie实现的。

在Django中使用session

依然是登录认证的例子
首先登录视图函数


class login(views.View):
def get(self,req,*args,**kwargs):
return render(req, "app1/login.html", {'massage': ''}) def post(self,req,*args,**kwargs):
user = req.POST.get('user')
pwd = req.POST.get('pwd')
c = models.Administrator.objects.filter(username=user, password=pwd).count()
print(c)
if c > 0:
req.session['is_login'] = True
req.session['username'] = user
return redirect('/index/')
else:
massage = '用户名或密码错误'
return render(req, "app1/login.html", {'massage': massage})

用于判断用户是否登录的装饰器


def auth(func):
def inner(request, *args, **kwargs):
is_login = request.session.get('is_login')
if is_login:
return func(request, *args, **kwargs)
else:
return redirect('/login')
return inner

至于其他登陆后进行处理的函数,只需要为其添加auth装饰器即可
这里发现,对于设置session和拿取session,和cookie的操作方式类似,那么它将设置的信息存储到了哪呢?答案是存到了数据库中
在数据库中发现了一张diango_session的表,存储的信息为

这里的信息应该是用某种加密算法加密了,expire_data为session存在截止时间

session的其他方法

  • request.session.setdefault(‘k1’,123) 存在则不设置
  • del request.session[‘k1’] 删除某条
  • request.session.clear() 删除所有
  • request.session.keys() 获得所有的key,输出为dict_keys([‘is_login’, ‘username’]),可for循环,不可以通过索引取值
  • request.session.values() 获得所有的值,输出dict_values([True, ‘sfencs’]),同上
  • request.session.items() 获得所有键值,输出dict_items([(‘is_login’, True), (‘username’, ‘sfencs’)]),同上
  • request.session.session_key 获得用户session的随机字符串
  • request.session.clear_expired() 将所有Session失效日期小于当前日期的数据删除
  • request.session.exists(“session_key”) 检查用户session的随机字符串在数据库中是否存在
  • request.session.set_expiry(value) 自己设置了过期时间,默认为两周。
    如果value是个整数,session会在些秒数后失效。
    如果value是个datatime或timedelta,session就会在这个时间后失效。
    如果value是0,用户关闭浏览器session就会失效。
    如果value是None,session会依赖全局session失效策略。

session的配置

SESSION_COOKIE_NAME = "sessionid"   # 存在浏览器的cookie键名
SESSION_COOKIE_PATH = "/" #session的cookie的使用路径
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
​

Django之cookie&session的更多相关文章

  1. day09 Django: 组件cookie session

    day09 Django: 组件cookie session   一.cookie和session都是会话跟踪技术     1.什么是会话             可以理解为客户端和服务端之间的一次会 ...

  2. django - 总结 - cookie|session

    Cookie是通过HTTP请求和响应头在客户端和服务器端传递的. 在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术. --------------------- ...

  3. python框架之Django(7)-Cookie&Session使用

    Cookie 添加 response.set_cookie 添加明文cookie response.set_cookie(key, value='', max_age=None, expires=No ...

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

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

  5. Django中cookie&session的实现

    1.什么叫Cookie Cookie翻译成中文是小甜点,小饼干的意思.在HTTP中它表示服务器送给客户端浏览器的小甜点.其实Cookie是key-value结构,类似于一个python中的字典.随着服 ...

  6. Django之cookie+session

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

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

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

  8. django框架--cookie/session

    目录 一.http协议无状态问题 二.会话跟踪技术--cookie 1.对cookie的理解 2.cookie的使用接口 3.cookie的属性 4.使用cookie的问题 三.会话跟踪技术--ses ...

  9. Django组件-cookie,session

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

随机推荐

  1. Solidity字符串类型

    字符串可以通过""或者''来表示字符串的值,Solidity中的string字符串不像C语言一样以\0结束,比如abcd这个字符串的长度就为我们所看见的字母的个数,它的长度为4. ...

  2. 软件架构设计学习总结(3):QQ空间技术架构之详解

    QQ空间作为腾讯海量互联网服务产品,经过近七年的发展,实现了从十万级到亿级同时在线的飞跃.在这个过程中,QQ空间团队遇到了哪些技术挑战?其站点前后台架构随着业务规模的变化又进行了怎样的演进与变迁?成长 ...

  3. mysql索引总结(4)-MySQL索引失效的几种情况

    mysql索引总结(1)-mysql 索引类型以及创建 mysql索引总结(2)-MySQL聚簇索引和非聚簇索引 mysql索引总结(3)-MySQL聚簇索引和非聚簇索引 mysql索引总结(4)-M ...

  4. k8s使用nfs动态存储

    1.Kubernetes集群管理员通过提供不同的存储类,可以满足用户不同的服务质量级别.备份策略和任意策略要求的存储需求.动态存储卷供应使用StorageClass进行实现,其允许存储卷按需被创建.如 ...

  5. AJAX unsupported media type 415错误处理

    一.问题 在使用angular做请求拦截时,因为依赖循环的问题,在请求拦截中改为使用ajax来发起请求拿到我想要的数据,结果出现了415 Unsupported Media Type错误,由于很久没使 ...

  6. Deep learning with Python 学习笔记(4)

    本节讲卷积神经网络的可视化 三种方法 可视化卷积神经网络的中间输出(中间激活) 有助于理解卷积神经网络连续的层如何对输入进行变换,也有助于初步了解卷积神经网络每个过滤器的含义 可视化卷积神经网络的过滤 ...

  7. PowerBuilder编程新思维1:扩展(Lua)

    前言 PowerBuilder作为开发工具退出一线行列已经很久了,在2019年来谈这样一款老旧的编程工具是否有意义?诚然,PB有着太多硬伤,但还是有它的用武之地的.而且今天讲的这个“新思维”大部分内容 ...

  8. 深入出不来nodejs源码-从fs.stat方法来看node架构

    node的源码分析还挺多的,不过像我这样愣头完全平铺源码做解析的貌似还没有,所以开个先例,从一个API来了解node的调用链. 首先上一张整体的图,网上翻到的,自己懒得画: 这里的层次结构十分的清晰, ...

  9. NavicatForOracle无法连接数据库,报错ORA-28547

    因为换了新项目,要用到oracle数据库,但是用Navicat连接oracle不像连接MySql那样简单,连接的时候总是报ORA-28547,最后搜了一下解决方案发现是install client没有 ...

  10. Android自定义Aop的Gradle Plugin

    [上一篇文章]中讲解了如何在Android使用AOP,会发现在Gradle配置aop会比较麻烦,每个module使用了aop都需要配置.接下来看如何简化配置. 1.创建Module 首先,需要建立一个 ...