一、Session 的概念

  • cookie 是在浏览器端保存键值对数据,而 session 是在服务器端保存键值对数据
  • session 的使用依赖 cookie:在使用 Session 后,会在 Cookie 中存储一个 sessionid 的数据,每次请求时浏览器都会将这个数据发给服务器,服务器在接收到 sessionid 后,会根据这个值找出这个请求者的 Session。

二、Django 中 Session 的存储

  • session 键值对数据保存

  • session 的键值对数据默认保存在 django 项目的一张数据库表中(表名为:django_session),保存格式如下:

  • 实际上是对数据有加密的,如下图:

三、Django 中 Session 的配置

Django 中默认支持 Session,其内部提供了 5 种类型的 Session 供开发者使用:

  1. - 数据库(默认)
  2. - 缓存
  3. - 文件
  4. - 缓存+数据库
  5. - 加密cookie

1)数据库 Session

  1. a. 配置 settings.py
  2. SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
  3. SESSION_COOKIE_NAME "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
  4. SESSION_COOKIE_PATH "/" # Session的cookie保存的路径(默认)
  5. SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
  6. SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
  7. SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
  8. SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
  9. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
  10. SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)

2)缓存 Session

  1. a. 配置 settings.py
  2. SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
  3. SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
  4. SESSION_COOKIE_NAME "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
  5. SESSION_COOKIE_PATH "/" # Session的cookie保存的路径
  6. SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
  7. SESSION_COOKIE_SECURE = False # 是否Https传输cookie
  8. SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
  9. SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
  10. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
  11. SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存

3)文件 Session

  1. a. 配置 settings.py
  2. SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
  3. SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile
  4. 模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
  5. SESSION_COOKIE_NAME "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
  6. SESSION_COOKIE_PATH "/" # Session的cookie保存的路径
  7. SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
  8. SESSION_COOKIE_SECURE = False # 是否Https传输cookie
  9. SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
  10. SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
  11. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
  12. SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存

4)缓存+数据库 Session

  1. a. 配置 settings.py
  2. SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎

5)加密 cookie Session

  1. a. 配置 settings.py
  2. SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎

四、Session 的基本操作:

  • 以键值对的格式写 session
  1. request.session['键']=值
  • 根据键读取值
  1. request.session.get('键',默认值)
  2. # 或者
  3. request.session['键']
  • 清除所有 session,在存储中删除值的部分
  1. request.session.clear()
  • 清除 session 数据,在存储中删除 session 的整条数据
  1. request.session.flush()
  • 删除 session 中的指定键及值,在存储中只删除某个键及对应的值
  1. del request.session['键']
  • 设置 session 数据有效时间; 如果不设置,默认过期时间为两周
  1. request.session.set_expiry(value)
  1. 如果过期时间的 value 是一个整数,则 session 数据 将在 value 秒没有活动后过期。
  2. 如果过期时间的 value 为 None,那么会话永不过期。
  3. 如果过期时间的 value 为 0,那么用户会话的 Cookie 将在用户的浏览器关闭时过期。

四、以下是使用例子:

  1. # 发短信接口
  2. def sms_send(request):
  3. # http://localhost:8000/duanxin/duanxin/sms_send/?phone=18434288349
  4. # 1 获取手机号
  5. phone = request.GET.get('phone')
  6. # 2 生成6位验证码
  7. code = aliyunsms.get_code(6, False)
  8. # 3 缓存到Redis
  9. #cache.set(phone,code,60) #60s有效期
  10. #print('判断缓存中是否有:',cache.has_key(phone))
  11. #print('获取Redis验证码:',cache.get(phone))
  12. #暂时用session处理
  13. request.session['phone'] = code
  14. request.session.set_expiry(300) #设置5分钟后过期
  15. print('判断缓存中是否有:', request.session.get('phone'))
  16. print('获取session验证码:',request.session.get('phone'))
  17. # 4 发短信
  18. result = aliyunsms.send_sms(phone, code)
  19. return HttpResponse(result)
  20. # 短信验证码校验
  21. def sms_check(request):
  22. # /duanxin/sms_check/?phone=xxx&code=xxx
  23. # 1. 电话和手动输入的验证码
  24. phone = request.GET.get('phone')
  25. code = request.GET.get('code')
  26. # 2. 获取redis中保存的code
  27. #print('缓存中是否包含:',cache.has_key(phone))
  28. #print('取值:',cache.get(phone))
  29. #cache_code = cache.get(phone)
  30. #获取session里的code
  31. print('取值:', request.session.get('phone'))
  32. cache_code = request.session.get('phone')
  33. # 3. 判断
  34. if code == cache_code:
  35. return HttpResponse(json.dumps({'result':'OK'}))
  36. else:
  37. return HttpResponse(json.dumps({'result':'False'}))

欢迎访问我的博客:http://bigyoung.cn

参考文档:

  1. https://www.lagou.com/lgeduarticle/87770.html
  2. https://www.cnblogs.com/lixiang1013/p/7821749.html
  3. Django 官方文档(中文版):https://docs.djangoproject.com/zh-hans/2.2/topics/http/sessions/

Django中的session的使用的更多相关文章

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

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

  2. Django中的session和cookie及分页设置

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  3. 137.在Django中操作session

    在Django中操作session 在django中session默认情况下是存储在服务器的数据库中的,在表中会根据sessionid来提取指定的session数据,然后再把这个sessionid放到 ...

  4. Django中cookie&session的实现

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

  5. Django中的session于cookie的用法

    1.cookies 1.django 中使用 cookies 1.设置cookies的值(将数据保存到客户端) 语法: 响应对象.set_cookie(key,value,expires) key:c ...

  6. Django中的Session与Cookie

    1.相同与不同 Cookie和Session都是为了记录用户相关信息的方式, 最大的区别就是Cookie在客户端记录而Session在服务端记录内容. 2.Cookie和Session之间的联系的建立 ...

  7. Django中的Session和cookie

    Session和cookie 参考文献:https://www.cnblogs.com/wupeiqi/articles/5246483.html 1.问题引入 1.1 cookie是什么? 保存在客 ...

  8. django中的session,cookie

    https://blog.csdn.net/chen1042246612/article/details/84327046 https://www.imooc.com/wenda/detail/396 ...

  9. Django中的cookie与session

    cookie与session的实现原理 HTTP被设计为”无状态”,每次请求都处于相同的空间中. 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来 ...

随机推荐

  1. 基于soap 的 python web services 服务开发指南

    文章大纲 序言 相关概念 SOA web services SOAP WSDL UDDI 环境搭建 我们使用 python 3.6 这个较新python 版本 服务端开发 客户端开发 suds-jur ...

  2. 常见字体图标库——font-awesome

    1.简介 FontAwesome一种带有网页功能的象形文字语言,并收集在一个集合里.字库中有675个图标,只支持英文搜索,中文地址:http://www.fontawesome.com.cn/ 2.使 ...

  3. 允许外部访问Windows本机的指定端口

    背景:目前公司有一台公网Windows服务器,有公网IP和内网IP,防火墙已开启 需求:9999端口需要对外开放 方案:在防火墙的入站规则里添加一条规则,使外部能够访问9999端口 问题:添加好规则后 ...

  4. 计算机BIOS的简单设置(要安装Linux需关闭Security Boot选项)

    计算机BIOS的简单设置(要安装Linux需关闭Security Boot选项) 发布时间:2016-12-07 22:46:19来源:linux网站作者:乐百川 BIOS是什么 BIOS全称是基本输 ...

  5. springboot学习笔记:7.IDEA下5步完成热部署配置

    开发工具IDEA 2017.02   JDK1.8 1.pom.xml中增加: <dependency> <groupId>org.springframework.boot&l ...

  6. springboot学习笔记:5.spring mvc(含FreeMarker+layui整合)

    Spring Web MVC框架(通常简称为"Spring MVC")是一个富"模型,视图,控制器"的web框架. Spring MVC允许你创建特定的@Con ...

  7. cs231n spring 2017 lecture16 Adversarial Examples and Adversarial Training

    (没太听明白,以后再听) 1. 如何欺骗神经网络? 这部分研究最开始是想探究神经网络到底是如何工作的.结果人们意外的发现,可以只改变原图一点点,人眼根本看不出变化,但是神经网络会给出完全不同的答案.比 ...

  8. getline的使用

    函数定义: getline(istream &in, string &s) 作用: 在C++中用 string 类型进行终端输入字符串时,解决无法输入带有空格的字符串的问题. 功能: ...

  9. getHibernateTemplate()的find用法大全

    一.find(String queryString); 示例:this.getHibernateTemplate().find("from bean.User"); 返回所有Use ...

  10. [LC] 150. Evaluate Reverse Polish Notation

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...