Django中的session的使用

一、Session 的概念

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

二、Django 中 Session 的存储

  • session 键值对数据保存 a722a7c49947a7d7ee505afa7828fa4a.png
  • session 的键值对数据默认保存在 django 项目的一张数据库表中(表名为:django_session),保存格式如下: 3c2291ab7560f7c5881bf60a3adf797b.png
  • 实际上是对数据有加密的,如下图: ba1b277d609a20d17215fca01093b6f6.png

三、Django 中 Session 的配置

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

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

1)数据库 Session

1a. 配置 settings.py 2 3 SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) 4 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,默认修改之后才保存(默认)

2)缓存 Session

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

3)文件 Session

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

4)缓存+数据库 Session

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

5)加密 cookie Session

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

四、Session 的基本操作:

  • 以键值对的格式写 session

    request.session['键']=值

  • 根据键读取值

    request.session.get('键',默认值)

    或者

    request.session['键']

  • 清除所有 session,在存储中删除值的部分

    request.session.clear()

  • 清除 session 数据,在存储中删除 session 的整条数据

    request.session.flush()

  • 删除 session 中的指定键及值,在存储中只删除某个键及对应的值

    del request.session['键']

  • 设置 session 数据有效时间; 如果不设置,默认过期时间为两周

    request.session.set_expiry(value)

  1. 如果过期时间的 value 是一个整数,则 session 数据 将在 value 秒没有活动后过期。
  2. 如果过期时间的 value 为 None,那么会话永不过期。
  3. 如果过期时间的 value 为 0,那么用户会话的 Cookie 将在用户的浏览器关闭时过期。

四、以下是使用例子:

1# 发短信接口 2def 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 13 #暂时用session处理 14 request.session['phone'] = code 15 request.session.set_expiry(300) #设置5分钟后过期 16 print('判断缓存中是否有:', request.session.get('phone')) 17 print('获取session验证码:',request.session.get('phone')) 18 # 4 发短信 19 result = aliyunsms.send_sms(phone, code) 20 return HttpResponse(result) 21 22 23# 短信验证码校验 24def sms_check(request): 25 # /duanxin/sms_check/?phone=xxx&code=xxx 26 # 1. 电话和手动输入的验证码 27 phone = request.GET.get('phone') 28 code = request.GET.get('code') 29 # 2. 获取redis中保存的code 30 #print('缓存中是否包含:',cache.has_key(phone)) 31 #print('取值:',cache.get(phone)) 32 #cache_code = cache.get(phone) 33 #获取session里的code 34 print('取值:', request.session.get('phone')) 35 cache_code = request.session.get('phone') 36 37 # 3. 判断 38 if code == cache_code: 39 return HttpResponse(json.dumps({'result':'OK'})) 40 else: 41 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/
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )