cookie与session的实现原理

  

  HTTP被设计为”无状态”,每次请求都处于相同的空间中。 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来自同一人的连续请求。上图很明显的展示了Django的session与cookie的实现原理。服务器会生成两份相同的cookie字符串,一份保存在本地,一份发向请求的浏览器。浏览器将收到的cookie字符串保存下来,当下次再发请求时,会将信息与这段cookie一同发送到服务器,服务器得到这段cookie会与本地保存的那份判断是否相同,如果相同就表示用户已经登录成功,保存用户登录成功的状态。Django的session保存在数据库中的数据相当于一个大字典,key为cookie的字符串,value仍是一个字典,字典的key和value为用户设置的相关信息。这样就可以方便的存取session里面的信息。

Cookies

cookies 是浏览器为 Web 服务器存储的一小段信息。 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies。它保存在浏览器下的某个文件夹下。

浏览器下的cookie:

Session  

  Django的Session机制会向请求的浏览器发送cookie字符串。同时也会保存到本地一份,用来验证浏览器登录是否为同一用户。它存在于服务器,Django默认会把session存入到数据库中。

  Session依赖于Cookie,如果浏览器不能保存cooki那么session就失效了。因为它需要浏览器的cooki值去session里做对比。session就是用来在服务器端保存用户的会话状态。

操作session

根据网友lvusyy的友情提示,在操作session之前,你需要同步一下Django的数据库。我用的是Django自带的sqlite3.所以需要执行同步的命令:

还有一点,在django处理请求的过程中,需要经过中间件的过滤,涉及到跨站请求伪造时,django会把请求阻止过滤掉,所以我们要在setting.py中禁用跨站请求伪造的中间件,如果不禁用,记得好像会报一个403的错误黄页。关于跨站请求伪造,之后的章节我会详细说明其功能用处:

Django中操作session:

  获取session:request.session[key]     request.session.get(key)

  设置session:reqeust.session[key] = value

  删除session:del request[key]

  request.session是每一个客户端相当于在上图中对应的value

一段简单的Django中实现session的代码,判断用户是否已经成功登录:

 1 def login(request):
 2     if request.method =='POST':
 3         username = request.POST.get('username')
 4         pwd = request.POST.get('pwd')
 5         if username =='lisi' and pwd == '12345':
 6             request.session['IS_LOGIN'] = True       设置session
 7             return redirect('/app01/home/')
 8
 9     return render(request,'login.html')
10
11 def home(request):
12     is_login = request.session.get('IS_LOGIN',False)   获取session里的值
13     if is_login:
14         return HttpResponse('order')
15     else:
16         return redirect('/app01/login/')

过期时间

cookie可以有过期时间,这样浏览器就知道什么时候可以删除cookie了。 如果cookie没有设置过期时间,当用户关闭浏览器的时候,cookie就自动过期了。 你可以改变 SESSION_EXPIRE_AT_BROWSER_CLOSE 的设置来控制session框架的这一行为。缺省情况下, SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 False ,这样,会话cookie可以在用户浏览器中保持有效达 SESSION_COOKIE_AGE 秒(缺省设置是两周,即1,209,600 秒)。 如果你不想用户每次打开浏览器都必须重新登陆的话,用这个参数来帮你。如果 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 True ,当浏览器关闭时,Django会使cookie失效。

SESSION_COOKIE_AGE:设置cookie在浏览器中存活的时间

在settings.py中添加:

例子

结合前端实现的cookie与session会话机制:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title></title>
 6 </head>
 7 <body>
 8     <form action="/app01/login/" method="post">
 9         <input type="text" name="username" />
10         <input type="password" name="pwd" />
11         <input type="submit" value="submit"/>
12     </form>
13
14 </body>
15 </html>

login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title></title><style>.header{height: 48px;}</style>
</head>
<body><div class="header"><div style="float: right">{{ username }}</div><div style="float: right"><a href="/app01/logout/">注销</a></div></div><div style="height: 500px;background-color: #ddd"></div>
</body>
</html>

home.html

views.py

def login(request):if request.method == "POST":username = request.POST.get('username')pwd = request.POST.get('pwd')if username == 'alex' and pwd == '123':request.session['IS_LOGIN'] = Truerequest.session['USRNAME'] = 'alex'return redirect('/app01/home/')elif username == 'eirc' and pwd == '123':request.session['IS_LOGIN'] = Truerequest.session['USRNAME'] = 'eirc'return redirect('/app01/home/')return render(request, 'login.html')def home(request):is_login = request.session.get('IS_LOGIN', False)if is_login:username = request.session.get('USRNAME', False)return render(request, 'home.html', {'username': username})else:return redirect("/app01/login/")

转载于:https://www.cnblogs.com/chenchao1990/p/5283725.html

Django中的cookie与session相关推荐

  1. Django 中的 cookie 和 session

    一.cookie 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网站.目前最新的 ...

  2. Django学习之Cookie和Session

    一.Cookie 1.Cookie的由来 2.什么是Cookie 3.Cookie的原理 4.查看Cookie 二.Django中操作Cookie 1.获取Cookie 2.设置Cookie 3.删除 ...

  3. Day 63 django 中间件、cookie、session

    Day 63 django 中间件.cookie.session 文章目录 Day 63 django 中间件.cookie.session 1.cookie与session 简介 2.django操 ...

  4. java中的Cookie是什么_第74节:Java中的Cookie和Session

    第74节:第74节:Java中的Cookie和Session ServletContext: 什么是ServletContext,有什么用哦,怎么用呢? 启动服务器后,会给每个应用程序创建一个Serv ...

  5. Django框架(21.Django中设置cookie以及获取cookie)

    状态保持 http协议是无状态的.下一次去访问一个页面时并不知道上一次对这个页面做了什么 Cookie 1.cookie是由服务器生成,存储在浏览器端的一小段文本信息. 2.cookie的特点: 以键 ...

  6. Django:Admin,Cookie,Session

    一. Admin的配置 1.Admin基础设置 admin是django强大功能之一,它能够从数据库中读取数据,呈现在页面中,进行管理.默认情况下,它的功能已经非常强大,如果你不需要复杂的功能,它已经 ...

  7. Python 之 Django框架( Cookie和Session、Django中间件、AJAX、Django序列化)

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

  8. 小白学Django第九天| Cookie和session的那些骚操作

    点击上方"JAVAandPython君",选择"星标"公众号 重磅干货,第一时间送达 小白学Django系列: 小白学Django第一天| MVC.MVT以及D ...

  9. koa中使用cookie 和session

    在koa中使用cookie app.keys = ['im a newer secret'] //设置签名的 Cookie 密钥. // 设置cookie app.use(async ctx => ...

最新文章

  1. C语言中整型浮点型在计算机中的存储
  2. 程序员真香!IT 业 2020 年平均工资最高
  3. Servlet Cookie处理
  4. 结构体序列为JSON
  5. vue之slot用法
  6. css3动画应用-音乐唱片旋转播放特效
  7. 【目标检测】ATSS: bridging the gap between anchor-based and anchor-free detection via ATSS (cvpr20)
  8. 【转】Mac本地生成SSH Key 的方法
  9. undefined reference to `pthread_create‘(linux下Clion使用thread报错)
  10. 中label换行问题_如何巧妙处理 Git 多平台换行符问题(LF or CRLF)
  11. UniWebView3 使用中遇到的坑
  12. RHEL 7 使用 CentOS 源安装 docker ce
  13. 手机模拟器自带root_VMOS Pro Android 手机上的模拟器 (手机版虚拟机)
  14. 短文本分类---小白从0到0.3的辛酸历程(上)
  15. badboy设置中文_badboy中文手册
  16. 数据结构与算法 知识点总结(中)---线性表,堆栈,队列
  17. python wms系统源码_jeewms仓库管理系统 v2.4.0
  18. php 执行opcode,PHP编译原理之Opcode ( Operation Code ) PHP代码执行过程
  19. 英特尔服务器cpu型号大全,Intel桌面处理器规格表
  20. Rust : calls in constant functions are limited to constant functions, tuple structs and tuple varian

热门文章

  1. 20个很有帮助的 Web 前端开发教程
  2. python处理子进程_Python多处理+子进程问题
  3. python一对一_Python:在数据存储区中建立一对一的关系
  4. html5选择试题及答案,全套html5面试题大全带答案
  5. linux内核实现ipsec,基于IPv6的IPSec原理分析和在Linux内核中的实现
  6. php nowdoc用来做什么,PHP中nowdoc和heredoc使用需要注意的一点
  7. java选择结构二星期几_java4选择结构 二
  8. python3.6安装cv2库_win10 +python3.6环境下安装opencv以及pycharm导入cv2有问题的解决办法...
  9. SpringBoot四大核心之starter——自定义starter
  10. 机器学习——数据预处理