Django Session 5种存储引擎配置与使用详解
本文详细解析Django中5种Session存储类型:数据库、缓存、文件、缓存+数据库及加密Cookie。涵盖settings.py核心配置参数如SESSION_ENGINE、SESSION_COOKIE_AGE等,以及如何在视图函数中获取、设置和删除Session数据。通过具体代码示例,帮助开发者根据性能与持久化需求选择合适的Session方案,并实现登录状态验证。
Django Session 概述
介绍
在计算机领域,特别是网络应用中,“Session”被称为会话控制。Session对象用于存储特定用户会话所需的属性和配置信息。当用户在应用程序的不同Web页面之间跳转时,存储在Session对象中的变量不会丢失,而是贯穿整个用户会话持续存在。
当用户向应用程序的Web页发起请求时,如果该用户尚未建立会话,Web服务器会自动创建一个Session对象。当会话过期或被主动放弃后,服务器将终止该会话。Session对象最常见的用途之一是存储用户的首选项设置。
Session机制基于Cookie实现。当用户打开浏览器访问服务器时,服务器会为每个用户的浏览器创建一个Session对象,并为每个Session对象生成一个唯一的Jsessionid标识。Session对象创建成功后,服务器会将这个Jsessionid以Cookie的形式回写给浏览器。当用户再次访问服务器时,浏览器会携带包含Jsessionid的Cookie数据一同访问。服务器通过不同的Jsessionid来查找对应的Session对象,从而为不同用户提供个性化的服务。
Django Session 5种存储引擎
使用
Django默认支持Session功能,内部为开发者提供了5种类型的Session存储后端供选择:
- 数据库(默认)
- 缓存
- 文件
- 缓存+数据库
- 加密cookie
数据库存储
数据库Session
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
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,默认修改之后才保存(默认)
b. 使用
def index(request):
# 获取、设置、删除Session中数据
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1']
# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
# 3.0无下面3个方法
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 用户session的随机字符串
request.session.session_key
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
# 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key")
# 删除当前用户的所有Session数据
request.session.delete("session_key")
request.session.delete()
request.session.flush()
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
缓存存储
缓存Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是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,默认修改之后才保存
b. 使用
配置方法与数据库Session相同,主要区别在于存储后端由数据库切换为缓存系统。
文件存储
文件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,默认修改之后才保存
b. 使用
配置方法与数据库Session相同,主要区别在于Session数据以文件形式存储在服务器指定路径中。
缓存+数据库混合存储
缓存+数据库Session
这种模式利用数据库进行数据持久化,同时利用缓存来提高读取效率,兼顾了性能与数据安全性。
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
b. 使用
配置方法与数据库Session相同,Django会自动先尝试从缓存读取,未命中时回退到数据库查询,并将结果写入缓存。
加密Cookie存储
加密cookie Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
b. 使用
配置方法与数据库Session相同,此模式下Session数据直接存储在用户浏览器的Cookie中,经过签名加密,无需服务器存储Session数据,适合无状态或轻量级应用。
Session 实际应用:登录验证
登录状态验证
def login_status(func):
def warp(request,*args,**kwargs):
user = request.session.get("username")
if user:
kwargs["username"] = user
return func(request,*args,**kwargs)
return redirect(login)
return warp
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













