第三百一十三节,Django框架,Session
第三百一十三节,Django框架,Session
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
1、数据库(默认)
2、缓存
3、文件
4、缓存+数据库
5、加密cookie
1、数据库Session,保存在数据库
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
全局配置Session
- Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
- a. 配置 settings.py
- SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)数据库保存session引擎
- SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
- SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
- SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
- SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
- SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
- SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
- SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
- SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认),默认就好
使用Session
- from django.shortcuts import render
- from app1.models import * #导入数据库操作模块
- from app1.biaodan import * #导入自定义表单验证模块
- #逻辑处理模块
- def special(request):
- request.session['k1'] = 123 #设置session
- print(request.session['k1']) #获取session
- 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中指定数据
- from django.shortcuts import render
- from app1.models import * #导入数据库操作模块
- from app1.biaodan import * #导入自定义表单验证模块
- #逻辑处理模块
- def special(request):
- request.session['k1'] = 123 #设置session
- print(request.session['k1']) #获取session
- del request.session['k1']
- 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()
- from django.shortcuts import render
- from app1.models import * #导入数据库操作模块
- from app1.biaodan import * #导入自定义表单验证模块
- #逻辑处理模块
- def special(request):
- request.session['k1'] = 123 #设置session
- request.session['k2'] = 456 # 设置session
- request.session['k3'] = 789 # 设置session
- # print(request.session['k1']) #获取session
- #
- print(request.session.keys())
- print(request.session.values())
- print(request.session.items())
- return render(request, 'app1/index.html')
获取用户session的随机字符串,也就是session名称
request.session.session_key获取用户session的随机字符串,也就是session名称
- from django.shortcuts import render
- from app1.models import * #导入数据库操作模块
- from app1.biaodan import * #导入自定义表单验证模块
- #逻辑处理模块
- def special(request):
- request.session['k1'] = 123 #设置session
- request.session['k2'] = 456 # 设置session
- request.session['k3'] = 789 # 设置session
- # print(request.session['k1']) #获取session
- print(request.session.session_key)
- return render(request, 'app1/index.html')
将所有Session失效日期小于当前日期的数据在数据库删除,也就是在数据库删除过期的Session数据
request.session.clear_expired()
- from django.shortcuts import render
- from app1.models import * #导入数据库操作模块
- from app1.biaodan import * #导入自定义表单验证模块
- #逻辑处理模块
- def special(request):
- # request.session['k1'] = 123 #设置session
- # request.session['k2'] = 456 # 设置session
- # request.session['k3'] = 789 # 设置session
- # print(request.session['k1']) #获取session
- request.session.clear_expired()
- return render(request, 'app1/index.html')
request.session.exists("获取当前随机字符串")检查 用户session的随机字符串 在数据库中是否
- from django.shortcuts import render
- from app1.models import * #导入数据库操作模块
- from app1.biaodan import * #导入自定义表单验证模块
- #逻辑处理模块
- def special(request):
- request.session['k1'] = 123 #设置session
- a = request.session.session_key
- print(request.session.exists(a))
- return render(request, 'app1/index.html')
request.session.delete("获取当前用户随机字符串")删除当前用户的所有Session数据
- from django.shortcuts import render
- from app1.models import * #导入数据库操作模块
- from app1.biaodan import * #导入自定义表单验证模块
- #逻辑处理模块
- def special(request):
- request.session['k1'] = 123 #设置session
- a = request.session.session_key
- request.session.delete(a)
- 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,保存在服务器内存
- a. 配置 settings.py
- SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎,表示保存在内存
- SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(default默认内存缓存,也可以是memcache,如果是memcache这里设置memcache缓存配置名称),此处别名依赖缓存的设置,见缓存章节
- SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
- SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
- SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
- SESSION_COOKIE_SECURE = False # 是否Https传输cookie
- SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
- SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
- SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
- SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
使用同上
3、文件Session,保存在文件里
- a. 配置 settings.py
- SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎,文件保存引擎
- SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
- SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
- SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
- SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
- SESSION_COOKIE_SECURE = False # 是否Https传输cookie
- SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
- SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
- SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
- SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
使用同上
4、缓存+数据库Session,缓存和数据库都保存
用户首次将Session保存到数据库,并保存一份到缓存,第二次到缓存里拿,如果缓存里没有,在到数据库拿又保存到缓存
- 数据库用于做持久化,缓存用于提高效率
- a. 配置 settings.py
- SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
使用同上
5、加密cookie Session,Session以cookie方式加密后保存在客户端
- a. 配置 settings.py
- SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
登录认证小列子
- def login(request):
- if request.method == "POST":
- username = request.POST.get("username")
- password = request.POST.get("password")
- if username == "zhangsan" and password == "":
- request.session["IS_LOGIN"] = True #创建session
- return redirect("/app01/home/")
- return render(request,"app01/login.html")
- def home(request):
- islogin = request.session.get("IS_LOGIN",False)
- if islogin:#如果用户已登录
- return render(request,"app01/menus.html")
- else:
- return redirect("/app01/login/")
- def logout(request):#退出
- try:
- del request.session['IS_LOGIN']
- except KeyError:
- pass
- return redirect("/app01/login/")
Session,保存在Redis
首先安装Redis软件,然后安装第三方插件django-redis模块
需要在全部配置里,将缓存配置和Session配置都要配置上
- #缓存配置
- # 自定义缓存key
- def default_key_func(key, key_prefix, version):
- return '%s:%s:%s' % (key_prefix, version, key)
- # 配置:
- CACHES = {
- 'default': {
- 'BACKEND': "django_redis.cache.RedisCache", #配置文件引擎
- 'LOCATION': "redis://127.0.0.1:6379", #配置文件缓存路径
- 'TIMEOUT': 300, # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)如果使用中没设置,这里启用
- 'OPTIONS': {
- "CLIENT_CLASS": "django_redis.client.DefaultClient",
- 'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
- 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3,删除百分之3)
- },
- 'KEY_PREFIX': 'jxiou', # 缓存key的前缀(默认空)
- 'VERSION': 1, # 缓存key的版本(默认1),设置后缓存key会是,KEY_PREFIX前缀加VERSION版本
- # 'KEY_FUNCTION': default_key_func # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
- }
- }
- #配置Session
- SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎,表示保存在内存
- SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(default默认内存缓存,也可以是memcache,如果是memcache这里设置memcache缓存配置名称),此处别名依赖缓存的设置,见缓存章节
- SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
- SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
- SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
- SESSION_COOKIE_SECURE = False # 是否Https传输cookie
- SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
- SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
- SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
- SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
应用同上
第三百一十三节,Django框架,Session的更多相关文章
- 第三百一十二节,Django框架,Cookie
第三百一十二节,Django框架,Cookie 注意:获取Cookie是在请求对象里处理,设置Cookie是在响应对象里处理 普通Cookieset_cookie()设置普通cookie 参数: ke ...
- 第三百一十九节,Django框架,文件上传
第三百一十九节,Django框架,文件上传 1.自定义上传[推荐] 请求对象.FILES.get()获取上传文件的对象上传对象.name获取上传文件名称上传对象.chunks()获取上传数据包,字节码 ...
- 第三百一十八节,Django框架,信号
第三百一十八节,Django框架,信号 Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 也就是当程序有指定动作时, ...
- 第三百一十六节,Django框架,中间件
第三百一十六节,Django框架,中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间 ...
- 第三百一十五节,Django框架,CSRF跨站请求伪造
第三百一十五节,Django框架,CSRF跨站请求伪造 全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...
- 第三百一十四节,Django框架,自定义分页
第三百一十四节,Django框架,自定义分页 自定义分页模块 #!/usr/bin/env python #coding:utf-8 from django.utils.safestring impo ...
- 第三百一十节,Django框架,模板语言
第三百一十节,Django框架,模板语言 模板语言就是可以将动态数据在html模板渲染的语言 一.接收值渲染 locals()函数,写在请求响应render()函数里,可以将逻辑处理函数里的变量传到h ...
- 第三百四十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别
第三百四十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别 第一步.首先下载,大神者也的倒立文字验证码识别程序 下载地址:https://gith ...
- Python学习(三十)—— Django框架简介
转载自:http://www.cnblogs.com/liwenzhou/p/8296964.html Django框架简介 一.MVC框架和MTV框架(了解即可) MVC,全名是Model View ...
随机推荐
- python标准库介绍——9 copy模块详解
==copy 模块== ``copy`` 模块包含两个函数, 用来拷贝对象, 如 [Example 1-64 #eg-1-64] 所示. ``copy(object) => object`` 创 ...
- 分享一:关于mysql中避免重复插入记录方法
一: INSERT ON DUPLICATE KEY UPDATE 如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重 ...
- jquery的animate()方法也可设置非css属性
如题,举例: $('body').animate({scrollTop:0}, 1500); $("body").animate({scrollTop:"-=" ...
- 【Android】3.3 MapFragment的使用
分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 3.3 示例3--MapFragment的使用 一.简介 TextureMapFragment:用于显示地图片 ...
- 【Android】6.4 DatePickerDialog和TimePickerDialog
分类:C#.Android.VS2015: 创建日期:2016-02-08 一.简介 在Android应用中,日期选择对话框和时间选择对话框是分别提供的. 日期选择对话框(DatePickerDial ...
- cocos2d-x解决中文乱码问题的几种办法
昨天改写cocos2d-x的例程,想在其基础上加上一个计分系统.没有分数实在让人没有玩下去的动力! 我在主场景上加上了一个CCLabelTTF,用于显示分数. 但是意外的发现,当内容含有中文时,CCL ...
- Ribbon对于SocketTimeOutException重试的坑以及重试代码解析
背景 本文基于Spring-Cloud, Daltson SR4 微服务一般多实例部署,在发布的时候,我们要做到无感知发布:微服务调用总会通过Ribbon,同时里面会实现一些重试的机制,相关配置是: ...
- hive12启动报错org.apache.thrift.server.TThreadPoolServer.<init>(Lorg/apache/thrift/server/TThreadPoolServer$Args;)
执行如下命令启动hive服务:./bin/hive --service hiveserver,报如下错误: Starting Hive Thrift ServerException in thread ...
- Hadoop副本数配置
一个文件,上传到hdfs上时指定的是几个副本就是几个.修改了副本数(dfs.replications),对已经上传了的文件也不会起作用.当然可以在上传文件的同时指定创建的副本数hadoop dfs - ...
- LeetCode: Min Stack 解题报告
Min Stack My Submissions Question Solution Design a stack that supports push, pop, top, and retrievi ...