0

我有以下要求:

  1. 用户必须能够查看(并注销)他们的其他会话。
  2. 会话必须在浏览器关闭时和一段时间不活动后过期
  3. default数据库不能用于存储会话。

我目前的方法是设置SESSION_EXPIRE_AT_BROWSER_CLOSE和添加一个中间件类,该类检查 last_activity / 并更新时间戳(或logout()在会话过期时调用),并对非活动会话运行定期清理。

但是,我找不到在请求之外访问非数据库支持的会话的方法(或在请求中访问除当前会话之外的任何内容的方法)此外,我找不到任何文档如何存储django_session表到另一个数据库。

我目前正在使用基于文件的缓存来使用缓存支持的会话,但这可以更改 - 唯一的要求是将会话存储在default数据库中。

4

1 回答 1

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)要将会话存储在不同的数据库中,您需要添加数据库路由器

就像是 :

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.
于 2013-09-26T06:39:13.957 回答