我有以下要求:
default
数据库不能用于存储会话。我当前的方法是设置SESSION_EXPIRE_AT_BROWSER_CLOSE
并添加一个middleware类来检查last_activity /并更新时间戳(或者如果会话已过期则调用logout()
)并运行非活动会话的定期清理。
但是,我找不到一种方法来访问请求之外的非数据库支持的会话(或者访问除请求中当前会话之外的任何内容的方法)
此外,我找不到任何文档如何将django_session
表存储到另一个数据库。
我目前正在使用基于文件缓存的缓存支持会话,但可以更改 - 唯一的要求是不将会话存储在default
数据库中。
答案 0 :(得分:1)
1)为此找到当前用户的所有会话 - request.user
- 您必须遍历所有会话对象解码数据并检查用户ID。不是很优化。类似的东西:
您可以优化以迭代未过期的会话。
for s in Session.objects.all():
data = s.get_decoded()
if data['_auth_user_id'] == request.user.id:
# you got session for current user
2)为此,您需要按照您的描述操作自定义中间件中的会话到期数据。
3)要在不同的数据库中存储会话,您需要添加database router。
类似的东西:
class SessionRouter(object):
"""
A router to control all database operations
sessions.
"""
def db_for_read(self, model, **hints):
if model == Session or model == SessionStore
return 'session_db'
return None
#similar more methods
在设置中
DATABASES = {
'session_db': {
#settings for session db
},
#any other databases.