如何正确处理Django会话

时间:2013-09-26 05:25:41

标签: django django-sessions django-cache

我有以下要求:

  1. 用户必须能够查看(并注销)其他会话。
  2. 会话必须在浏览器关闭时以及在不活动的perioid之后 BOTH 到期。
  3. default数据库不能用于存储会话。
  4. 我当前的方法是设置SESSION_EXPIRE_AT_BROWSER_CLOSE并添加一个middleware类来检查last_activity /并更新时间戳(或者如果会话已过期则调用logout())并运行非活动会话的定期清理。

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

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

1 个答案:

答案 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.