第三百一十三节,Django框架,Session

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

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

1、数据库Session,保存在数据库

Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。

全局配置Session

  1. Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
  2.  
  3. a. 配置 settings.py
  4.  
  5. SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)数据库保存session引擎
  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,默认修改之后才保存(默认),默认就好

使用Session

  1. from django.shortcuts import render
  2. from app1.models import * #导入数据库操作模块
  3. from app1.biaodan import * #导入自定义表单验证模块
  4. #逻辑处理模块
  5. def special(request):
  6. request.session['k1'] = 123 #设置session
  7. print(request.session['k1']) #获取session
  8. return render(request, 'app1/index.html')

获取、设置、删除Session中指定数据
request.session['k1'] 获取Session中数据,不存在报错
request.session.get('k1',None) 获取Session中数据,不存在返回None
request.session['k1'] = 123 设置Session中数据,存在覆盖
request.session.setdefault('k1',123) 设置Session中数据,存在不设置
del request.session['k1'] 删除Session中指定数据

  1. from django.shortcuts import render
  2. from app1.models import * #导入数据库操作模块
  3. from app1.biaodan import * #导入自定义表单验证模块
  4. #逻辑处理模块
  5. def special(request):
  6. request.session['k1'] = 123 #设置session
  7. print(request.session['k1']) #获取session
  8. del request.session['k1']
  9. return render(request, 'app1/index.html')

获取Session中所有 键、值、键值对
request.session.keys()获取Session中所有的键
request.session.values()获取Session中所有的值
request.session.items()获取Session中所有的键值对
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()

  1. from django.shortcuts import render
  2. from app1.models import * #导入数据库操作模块
  3. from app1.biaodan import * #导入自定义表单验证模块
  4. #逻辑处理模块
  5. def special(request):
  6. request.session['k1'] = 123 #设置session
  7. request.session['k2'] = 456 # 设置session
  8. request.session['k3'] = 789 # 设置session
  9. # print(request.session['k1']) #获取session
  10.  
  11. #
  12. print(request.session.keys())
  13. print(request.session.values())
  14. print(request.session.items())
  15.  
  16. return render(request, 'app1/index.html')

获取用户session的随机字符串,也就是session名称
request.session.session_key获取用户session的随机字符串,也就是session名称

  1. from django.shortcuts import render
  2. from app1.models import * #导入数据库操作模块
  3. from app1.biaodan import * #导入自定义表单验证模块
  4. #逻辑处理模块
  5. def special(request):
  6. request.session['k1'] = 123 #设置session
  7. request.session['k2'] = 456 # 设置session
  8. request.session['k3'] = 789 # 设置session
  9. # print(request.session['k1']) #获取session
  10.  
  11. print(request.session.session_key)
  12.  
  13. return render(request, 'app1/index.html')

将所有Session失效日期小于当前日期的数据在数据库删除,也就是在数据库删除过期的Session数据
request.session.clear_expired()

  1. from django.shortcuts import render
  2. from app1.models import * #导入数据库操作模块
  3. from app1.biaodan import * #导入自定义表单验证模块
  4. #逻辑处理模块
  5. def special(request):
  6. # request.session['k1'] = 123 #设置session
  7. # request.session['k2'] = 456 # 设置session
  8. # request.session['k3'] = 789 # 设置session
  9. # print(request.session['k1']) #获取session
  10.  
  11. request.session.clear_expired()
  12.  
  13. return render(request, 'app1/index.html')

request.session.exists("获取当前随机字符串")检查 用户session的随机字符串 在数据库中是否

  1. from django.shortcuts import render
  2. from app1.models import * #导入数据库操作模块
  3. from app1.biaodan import * #导入自定义表单验证模块
  4. #逻辑处理模块
  5. def special(request):
  6. request.session['k1'] = 123 #设置session
  7.  
  8. a = request.session.session_key
  9. print(request.session.exists(a))
  10.  
  11. return render(request, 'app1/index.html')

request.session.delete("获取当前用户随机字符串")删除当前用户的所有Session数据

  1. from django.shortcuts import render
  2. from app1.models import * #导入数据库操作模块
  3. from app1.biaodan import * #导入自定义表单验证模块
  4. #逻辑处理模块
  5. def special(request):
  6. request.session['k1'] = 123 #设置session
  7.  
  8. a = request.session.session_key
  9. request.session.delete(a)
  10.  
  11. return render(request, 'app1/index.html')

request.session.set_expiry(value)设置session失效时间
  * 如果value是个整数,session会在value秒数后失效。
  * 如果value是个datatime或timedelta,session就会在这个时间后失效。
  * 如果value是0,用户关闭浏览器session就会失效。
  * 如果value是None,session会依赖全局session失效策略。


2、缓存Session,保存在服务器内存

  1. a. 配置 settings.py
  2.  
  3. SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎,表示保存在内存
  4. SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(default默认内存缓存,也可以是memcache,如果是memcache这里设置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,保存在文件里

  1. a. 配置 settings.py
  2.  
  3. SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎,文件保存引擎
  4. SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
  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,默认修改之后才保存

使用同上


4、缓存+数据库Session,缓存和数据库都保存

用户首次将Session保存到数据库,并保存一份到缓存,第二次到缓存里拿,如果缓存里没有,在到数据库拿又保存到缓存

  1. 数据库用于做持久化,缓存用于提高效率
  2.  
  3. a. 配置 settings.py
  4.  
  5. SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎

使用同上


5、加密cookie Session,Session以cookie方式加密后保存在客户端

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

登录认证小列子

  1. def login(request):
  2. if request.method == "POST":
  3. username = request.POST.get("username")
  4. password = request.POST.get("password")
  5. if username == "zhangsan" and password == "":
  6. request.session["IS_LOGIN"] = True #创建session
  7. return redirect("/app01/home/")
  8. return render(request,"app01/login.html")
  9.  
  10. def home(request):
  11. islogin = request.session.get("IS_LOGIN",False)
  12. if islogin:#如果用户已登录
  13. return render(request,"app01/menus.html")
  14. else:
  15. return redirect("/app01/login/")
  16.  
  17. def logout(request):#退出
  18. try:
  19. del request.session['IS_LOGIN']
  20. except KeyError:
  21. pass
  22. return redirect("/app01/login/")

Session,保存在Redis

首先安装Redis软件,然后安装第三方插件django-redis模块

需要在全部配置里,将缓存配置和Session配置都要配置上

  1. #缓存配置
  2. # 自定义缓存key
  3. def default_key_func(key, key_prefix, version):
  4. return '%s:%s:%s' % (key_prefix, version, key)
  5. # 配置:
  6. CACHES = {
  7. 'default': {
  8. 'BACKEND': "django_redis.cache.RedisCache", #配置文件引擎
  9. 'LOCATION': "redis://127.0.0.1:6379", #配置文件缓存路径
  10.  
  11. 'TIMEOUT': 300, # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)如果使用中没设置,这里启用
  12. 'OPTIONS': {
  13. "CLIENT_CLASS": "django_redis.client.DefaultClient",
  14. 'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
  15. 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3,删除百分之3)
  16. },
  17. 'KEY_PREFIX': 'jxiou', # 缓存key的前缀(默认空)
  18. 'VERSION': 1, # 缓存key的版本(默认1),设置后缓存key会是,KEY_PREFIX前缀加VERSION版本
  19. # 'KEY_FUNCTION': default_key_func # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
  20. }
  21. }

  22. #配置Session
  23. SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎,表示保存在内存
  24. SESSION_CACHE_ALIAS = 'default'         # 使用的缓存别名(default默认内存缓存,也可以是memcache,如果是memcache这里设置memcache缓存配置名称),此处别名依赖缓存的设置,见缓存章节
  25.  
  26. SESSION_COOKIE_NAME = "sessionid"       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
  27. SESSION_COOKIE_PATH = "/"              # Session的cookie保存的路径
  28. SESSION_COOKIE_DOMAIN = None          # Session的cookie保存的域名
  29. SESSION_COOKIE_SECURE = False       # 是否Https传输cookie
  30. SESSION_COOKIE_HTTPONLY = True       # 是否Session的cookie只支持http传输
  31. SESSION_COOKIE_AGE = 1209600         # Session的cookie失效日期(2周)
  32. SESSION_EXPIRE_AT_BROWSER_CLOSE = False   # 是否关闭浏览器使得Session过期
  33. SESSION_SAVE_EVERY_REQUEST = False     # 是否每次请求都保存Session,默认修改之后才保存

应用同上

第三百一十三节,Django框架,Session的更多相关文章

  1. 第三百一十二节,Django框架,Cookie

    第三百一十二节,Django框架,Cookie 注意:获取Cookie是在请求对象里处理,设置Cookie是在响应对象里处理 普通Cookieset_cookie()设置普通cookie 参数: ke ...

  2. 第三百一十九节,Django框架,文件上传

    第三百一十九节,Django框架,文件上传 1.自定义上传[推荐] 请求对象.FILES.get()获取上传文件的对象上传对象.name获取上传文件名称上传对象.chunks()获取上传数据包,字节码 ...

  3. 第三百一十八节,Django框架,信号

    第三百一十八节,Django框架,信号 Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 也就是当程序有指定动作时, ...

  4. 第三百一十六节,Django框架,中间件

    第三百一十六节,Django框架,中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间 ...

  5. 第三百一十五节,Django框架,CSRF跨站请求伪造

    第三百一十五节,Django框架,CSRF跨站请求伪造  全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...

  6. 第三百一十四节,Django框架,自定义分页

    第三百一十四节,Django框架,自定义分页 自定义分页模块 #!/usr/bin/env python #coding:utf-8 from django.utils.safestring impo ...

  7. 第三百一十节,Django框架,模板语言

    第三百一十节,Django框架,模板语言 模板语言就是可以将动态数据在html模板渲染的语言 一.接收值渲染 locals()函数,写在请求响应render()函数里,可以将逻辑处理函数里的变量传到h ...

  8. 第三百四十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别

    第三百四十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别 第一步.首先下载,大神者也的倒立文字验证码识别程序 下载地址:https://gith ...

  9. Python学习(三十)—— Django框架简介

    转载自:http://www.cnblogs.com/liwenzhou/p/8296964.html Django框架简介 一.MVC框架和MTV框架(了解即可) MVC,全名是Model View ...

随机推荐

  1. python标准库介绍——9 copy模块详解

    ==copy 模块== ``copy`` 模块包含两个函数, 用来拷贝对象, 如 [Example 1-64 #eg-1-64] 所示. ``copy(object) => object`` 创 ...

  2. 分享一:关于mysql中避免重复插入记录方法

    一: INSERT ON DUPLICATE KEY UPDATE 如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重 ...

  3. jquery的animate()方法也可设置非css属性

    如题,举例: $('body').animate({scrollTop:0}, 1500); $("body").animate({scrollTop:"-=" ...

  4. 【Android】3.3 MapFragment的使用

    分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 3.3 示例3--MapFragment的使用 一.简介 TextureMapFragment:用于显示地图片 ...

  5. 【Android】6.4 DatePickerDialog和TimePickerDialog

    分类:C#.Android.VS2015: 创建日期:2016-02-08 一.简介 在Android应用中,日期选择对话框和时间选择对话框是分别提供的. 日期选择对话框(DatePickerDial ...

  6. cocos2d-x解决中文乱码问题的几种办法

    昨天改写cocos2d-x的例程,想在其基础上加上一个计分系统.没有分数实在让人没有玩下去的动力! 我在主场景上加上了一个CCLabelTTF,用于显示分数. 但是意外的发现,当内容含有中文时,CCL ...

  7. Ribbon对于SocketTimeOutException重试的坑以及重试代码解析

    背景 本文基于Spring-Cloud, Daltson SR4 微服务一般多实例部署,在发布的时候,我们要做到无感知发布:微服务调用总会通过Ribbon,同时里面会实现一些重试的机制,相关配置是: ...

  8. hive12启动报错org.apache.thrift.server.TThreadPoolServer.<init>(Lorg/apache/thrift/server/TThreadPoolServer$Args;)

    执行如下命令启动hive服务:./bin/hive --service hiveserver,报如下错误: Starting Hive Thrift ServerException in thread ...

  9. Hadoop副本数配置

    一个文件,上传到hdfs上时指定的是几个副本就是几个.修改了副本数(dfs.replications),对已经上传了的文件也不会起作用.当然可以在上传文件的同时指定创建的副本数hadoop dfs - ...

  10. LeetCode: Min Stack 解题报告

    Min Stack My Submissions Question Solution Design a stack that supports push, pop, top, and retrievi ...