cookie与session简介

  1. """
  2. 回忆:HTTP协议四大特性
  3. 1.基于请求响应
  4. 2.基于TCP、IP作用于应用层之上的协议
  5. 3.无状态
  6. 不保存客户端的状态
  7. 4.无连接
  8. """
  9. 最开始的网站都不需要用户注册 所有人来访问获取到的数据都是一样的
  10. 随着互联网的发展很多网站需要指定当前用户的状态
  11. cookie
  12. 保存在客户端与用户状态相关的信息
  13. session
  14. 保存在服务端与用户状态相关的信息
  15. ps:session的工作需要依赖于cookie
  16. ps:浏览器有资格拒绝保存服务端发送过来的cookie数据
  17. ps:以后我们还会接触到tokenjwt等各种技术 目的都只有一个>>>:记录某种状态

早期cookies

最开始的浏览器,每次向服务器的请求都自报家门,即每发一次请求,都把用户名和密码都发过去:

当用户第一次把用户名和密码输对了之后。浏览器自动保存用户名和密码。发请求时,浏览器自动帮你输入用户名密码。

浏览器有能力记住不同网站的用户名和密码。此时浏览器也就是客户端。

产生了cookie的定义:

保存在客户端与用户状态相关的信息(通常情况下类似于字典的kv键值对)

早期的cookies很不安全:

真实的用户名密码保存在浏览器不安全。万一有人打开你的电脑,窃取你浏览器的密码。

随机字符串解决cookies安全问题

所以采取了以下办法:

当第一次输对了用户名和密码,服务端会给你发一个随机字符串。服务端有一张表记着字符串和用户的对应关系。下次访问服务端的时候,你把这个随机字符串带上,服务端可以通过表来确定这个随机字符串对应哪个用户。

这样做的好处:

外人查看随机字符串,也无法查看用户的密码。而用户可以拿着随机字符串进行登录。

session的定义:

用户真正的数据保存在服务端,所以我们把保存在服务端中,跟用户状态相关的信息叫做session。

随机字符串叫什么?

随机字符串既存在于浏览器,也存在于服务端。

在客户端上叫cookies 。

在服务端上叫session。

注意:

session是不可能单独工作的,要依赖于cookies。

所有跟用户状态相关的操作 都要依赖于cookies

禁止浏览器保存cookies

在开发者工具的application查看cookies:

浏览器有资格拒绝保存cookies:

禁用cookies后无法进行登录:

django操作cookie

  1. from django.shortcuts import render,HttpResponse,redirect
  2. return render()
  3. return HttpResponse()
  4. return redirect()
  5. 要想操作cookie就不能直接返回HttpResponse对象 必须先用变量接收
  6. obj1 = render()
  7. return obj1
  8. obj2 = HttpResponse()
  9. return obj2
  10. obj3 = redirect()
  11. return obj3

set_cookie

要想操作cookie就不能直接返回HttpResponse对象 必须先用变量接收。

如下图,先产生HttpResponse对象,再用对象调用set_cookie方法,此方法让浏览器保存键值对:

查看浏览器报错的cookies键值对:

set_signed_cookie

  1. HttpResponse对象.set_signed_cookie(key,
  2. value,
  3. salt='加密盐',
  4. max_age=None,
  5. expires=None
  6. ...
  7. )

参数:

  • key, 键
  • value='', 值
  • max_age=None, 超时时间
  • 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获取(不是绝对,底层抓包可以获取到也可以被覆盖)

cookies也是可以有过期时间的。

request.COOKIES

通过request.COOKIES查看cookies键值对:

因为浏览器现在已经有cookies,所以每次访问路由都会携带cookies。

delete_cookie

  1. def logout(request):
  2. rep = redirect("/login/")
  3. rep.delete_cookie("user") # 删除用户浏览器上之前设置的usercookie值
  4. return rep
  5. '''所谓退出登录本质其实就是将客户端的标识用户身份的cookie删除'''

用户登录功能

  1. def login_func(request):
  2. if request.method == 'POST':
  3. username = request.POST.get('username')
  4. password = request.POST.get('password')
  5. if username == 'jason' and password == '123':
  6. obj = redirect('/home/')
  7. obj.set_cookie('name', username)
  8. return obj
  9. return render(request, 'loginPage.html')

前端编写表单:

后端视图函数:

让客户端保存凭证,并重定向回home页面

(Home页面只有登录的用户才可以查看):

Homepage获取cookies:

服务器询问你的cookies有没有name这个键。当浏览器携带cookies时,才能访问home页面,没有cookies就重定向回登录页面。

给视图函数添加装饰器

  1. def login_auth(func_name):
  2. def inner(request, *args, **kwargs):
  3. if request.COOKIES.get('name'):
  4. res = func_name(request, *args, **kwargs)
  5. return res
  6. return redirect('/login/')
  7. return inner
  8. @login_auth
  9. def home_func(request):
  10. return HttpResponse('home页面 只有登录的用户才可以查看')

新需求:

需要登录才能访问的页面有好几个.

极端情况:

我们有三百个视图函数,视图函数返回的页面,登录之后的用户才能查看。

在不影响函数原有的功能的基础下,给其添加新功能,可以使用:

装饰器

在请求访问该页面的时候携带cookies时,继续执行视图函数。

请求未携带cookies时,重定向回登录页面。

给多个视图函数添加装饰器:

登录成功后重定向回原页面

进阶操作:

用户没有登录之前访问某个页面,此时让用户跳转到登录页面,用户输入用户名密码登录之后,跳回用户原来想访问的页面。

  1. def login_func(request):
  2. if request.method == 'POST':
  3. username = request.POST.get('username')
  4. password = request.POST.get('password')
  5. if username == 'jason' and password == '123':
  6. target_path = request.GET.get('next')
  7. if target_path:
  8. obj = redirect(target_path)
  9. else:
  10. obj = redirect('/home/')
  11. obj.set_cookie('name', username)
  12. return obj
  13. return render(request, 'loginPage.html')
  14. def login_auth(func_name):
  15. def inner(request, *args, **kwargs):
  16. # print(request.path) # 只获取用户输入的路由信息
  17. # print(request.path_info) # 只获取用户输入的路由信息
  18. target_path = request.path_info
  19. # print(request.get_full_path()) # 获取用户输入的路由信息+问号后面携带的数据
  20. if request.COOKIES.get('name'):
  21. res = func_name(request, *args, **kwargs)
  22. return res
  23. return redirect('/login/?next=%s' % target_path)
  24. return inner

获取路由的三个方法

查看三个方法返回的结果:

三个方法的区别:访问home路由时,使用问号携带一些信息。

第三个方法,可以获取整个路由,并且也可以获取问号携带的信息:

总结:

为了实现上述需求,我们使用path_info方法:

先获取用户想访问页面的路由信息,存储在变量名target_path中:

跳转到登录页面时,通过问号携带信息:

如下例子中,用户登录之前想访问的页面路由是/home1/

之前登录成功之后,我们重定向的页面时写死的:

现在我们添加判断:

target_path不存在的情况,意味着用户是直接访问的登录页面。

此时的request.GET.get('next')是获取不到值的,因为这个获取的是路由后面通过问号携带的信息。此时走else分支:跳转回home首页

当target_path存在的情况,意味着用户是从别的页面跳转过来的。此时通过request.GET.get('next')获取用户是从哪里来的。然后给他重定向回到原页面。

django操作session

  1. 由于session是保存在服务端上面的数据 就应该有个地方能够存储
  2. 我们只需要执行数据库迁移命令即可 django会自动创建很多需要的表
  3. django默认的session失效时间是14
  4. 设置session
  5. request.session['key'] = value
  6. 1.生成一个随机字符串
  7. 2.value数据做加密处理 并在django_session表中存储
  8. 随机字符串>>>加密数据
  9. 3.将随机字符串也发送一份给客户端保存(cookie)
  10. sessionid:随机字符串
  11. 获取session
  12. request.session.get('key')
  13. 1.自动获取随机字符串
  14. 2.django_session表中根据随机字符串获取加密的数据
  15. 3.自动解密数据并处理到request.sesion.get()中
  16. 补充说明
  17. 1.可以设置过期时间
  18. 2.存储session数据的位置也可以修改 各种数据库 甚至一个文件

session保存的位置

  1. 由于session是保存在服务端上面的数据 就应该有个地方能够存储
  2. 我们只需要执行数据库迁移命令即可 django会自动创建很多需要的表
  3. django默认的session失效时间是14

如下图所示,django自动创建的表中,有一张session表:

自动创建的session表有如下字段:

设置session

  1. 设置session
  2. request.session['key'] = value
  3. 1.生成一个随机字符串
  4. 2.value数据做加密处理 并在django_session表中存储
  5. 随机字符串>>>加密数据
  6. 3.将随机字符串也发送一份给客户端保存(cookie)
  7. sessionid:随机字符串

示例:

在没有进行数据库迁移的情况下,执行这条命令会报错:

正常执行这条命令,会将session表里添加一条数据:

session_data:

存储真正跟用户相关的数据,

我们设置session时使用的是:request.session['key'] = 'value'

举个例子:request.session['username']= 'cloud'

那么session中存储的就是加密过的'cloud'

session_key:

存储的是针对key生成一个加密之后的字符串。

expire_date:

存储session的过期时间。django中默认的session失效时间是14天。

流程推导(重要)

  1. 浏览器朝服务端发请求。
  2. 服务端创建session。

    服务端在django_session表中,

    生成加密字符串(session_key)、加密之后的用户数据(session_data)
  3. 服务端将加密字符串(session_key)发送给浏览器保存,此时这个加密字符串就称之为cookies.

查看浏览器保存的session_key:

浏览器是以键值对的形式保存的,键是浏览器自己取的,不必在意。这个值就是服务端发送过来的session_key。

下次浏览器访问服务端,就会自动携带session_key(cookies),服务端会拿着浏览器带来的session_key去保存session的表中进行校验,查看是否有相同的字符串。

获取session

  1. 获取session
  2. request.session.get('key')
  3. 1.自动获取随机字符串
  4. 2.django_session表中根据随机字符串获取加密的数据
  5. 3.自动解密数据并处理到request.sesion.get()中

示例:

流程推导(重要)

  1. 服务端接受浏览器传过来的加密字符串(session_key)
  2. 拿着加密字符串去session表中查找
  3. 当查找到相同的字符串,取出其对应的session_data
  4. 对session_data自动解密,并处理到request.sesion.get()中

设置session过期时间 set_expiry

示例:

set_expiry:设置session的过期时间,括号里填写的单位是秒,这里的意思是session创建后3秒就过期。

session补充方法

  1. # 将所有Session失效日期小于当前日期的数据删除
  2. request.session.clear_expired()
  3. # 检查会话session的key在数据库中是否存在
  4. request.session.exists("session_key")
  5. # 删除当前会话的所有Session数据
  6. request.session.delete() # 只删除客户端的cookies
  7. # 删除当前的会话数据并删除会话的Cookie。
  8. request.session.flush() # 客户端cookies、服务端session都删除
  9. # 设置会话Session和Cookie的超时时间
  10. request.session.set_expiry(value)
  11. * 如果value是个整数,session会在些秒数后失效。
  12. * 如果value是个datatimetimedeltasession就会在这个时间后失效。
  13. * 如果value0,用户关闭浏览器session就会失效。
  14. * 如果valueNone,session会依赖全局session失效策略(在django框架下默认14天)。

cookie与session简介 django操作cookie django操作session的更多相关文章

  1. {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

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

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

  3. django中操作cookie与session

    cookie 什么是Cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息. Cookie的 ...

  4. Django -聚合分组,FQ操作, cookie, session

    一. 聚合查询和分组 1. 聚合 aggregate(*args, **kwargs) 对一组数据进行统计分析, 通过对QuerySet进行计算, 返回一个聚合值得字典. arrgregate()中每 ...

  5. Django中cookie和session的操作

    一.cookie和session cookie:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是 ...

  6. django操作cookie和session

    一.cookie:保存在客户端浏览器上的键值对 Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会 ...

  7. Django中Cookie和Session配置和操作

    Cookie Cookie以键值对Key-Value形势进行信息的存储. Cookie基于域名安全,不同域名的Cookie是不能互相访问的 Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏 ...

  8. Django 操作Cookie与Session

    目录 Cookie Session Django中操作Cookie 基本操作 基于cookie的登录装饰器 Django中操作Session 基本操作 Session流程解析 基于session的登录 ...

  9. 在pycharm中批量插入表数据、分页原理、cookie和session介绍、django操作cookie

    昨日内容回顾 ajax发送json格式数据 ''' 1. urlencoded 2. form-data 3. json ''' 1. ajax $.ajax({ data: JSON.stringi ...

  10. Django组件-cookie与session

    一.会话跟踪技术 1.什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而 ...

随机推荐

  1. 微服务系列-基于Spring Cloud Eureka进行服务的注册与消费

    公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 在之前的几个教程中,我们学了: 使用 RestTemplate 的 Spring Boot 微服务通信示例 使用 WebC ...

  2. 【开源】int,long long去一边去:高精度大合集!

    加法 \(add\) string add(string s1, string s2) { //时间复杂度 O(log n) string res = ""; int c = 0, ...

  3. 小米二面:Redis 如何保证数据不丢失?

    前段时间表妹收到了小米秋招补录的面试邀请,一面还算顺利,很快就通过了,但在看二面面试录屏的时候,我发现了一个问题,回答的不是很好,也就是我们今天要聊的这个问题:Redis 如何保证数据不丢失? 很多人 ...

  4. Go语言数组与切片学习总结

    一.数组 数组的定义:相同类型的数据集合 go语言中数组的索引从0开始 没有赋值的数值型数组,默认值为0 数组一旦被创建,它的大小就是不可改变的 (1)声明数组与打印 var 变量名 [大小]变量类型 ...

  5. Aiganize组局小程序开发手册

    1. 开发阶段概述: 第一阶段: 针对组局和参局的产品功能落地完善小程序, 修改前端界面,去除冗余, 完善数据库设计 完善组局参局的功能 让每个用户能参与组局大厅的组局 让用户能申请为组局者发起组局, ...

  6. 渐进式web全栈:blazor web app

    前言 本文要说的这种开发模式,这种模式并不是只有blazor支持,js中有一样的方案next.js nuxt.js:blazor还有很多其它内容,本文近关注渐进式开发模式. 是的,前后端是主流,不过以 ...

  7. Selenium等待元素出现

    https://www.selenium.dev/documentation/webdriver/waits/ 有时候我们需要等待网页上的元素出现后才能操作.selenium中可以使用以下几种方法等大 ...

  8. 当数字孪生系统接入CesiumJS,将为智慧城市项目带来怎样的改变?

    数字孪生系统接入CesiumJS的契机,正是智慧城市项目的需要.因为许多智慧城市项目中包含了大量地形.倾斜摄影.DOM.DEM等GIS数据,那么为了能够在数字孪生系统中导入这些GIS数据,同时让这些数 ...

  9. CSS语法检查利器之csslint

    本文于2015年底完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 背景 前段时间研究使用YUI Compressor压缩项目里的js和cs ...

  10. cmake的安装方法

    最近参与一个新项目,这个项目使用cmake作为构建系统.作为Java程序员,平常都使用ant或者maven来构建,难得有机会接触cmake之类的工具,所以参与这个项目是个学习cmake的好机会. 但干 ...