【问题标题】:Django session expiry?Django会话到期?
【发布时间】:2018-09-04 18:43:47
【问题描述】:

从 django 的文档中,我的印象是调用:

request.session.set_expiry(300)

从一个角度来看会导致会话在五分钟后过期不活动;但是,这不是我在 django trunk 中遇到的行为。如果我从一个视图调用此方法,然后浏览到不调用该方法的其他视图,会话将在五分钟后到期。我所期望的行为是仅在五分钟不活动后才过期,而不是简单地未能在过期前再次调用 set_expiry。

然后我的问题是我真的需要在每个视图中调用 set_expiry 吗?如果是这样,是否存在一些可能有帮助的装饰器?我无法想象这不是贡献的一部分。

谢谢, 皮特

【问题讨论】:

    标签: python django


    【解决方案1】:

    作为这些方法的作者,我可以看到文档对此不是很清楚。您的观察是正确的:只有导致会话更改的请求才被视为“活动”。

    您可以使用SESSION_SAVE_EVERY_REQUEST 设置来获得您所追求的行为(显然需要保存每个请求的会话成本)。

    注意:它将使用最新的到期日期更新现有会话记录。

    【讨论】:

    • 谢谢克里斯,做到了。您刚刚提供的信息应该包含在文档中。
    • 同意。介意开票吗? ;)
    【解决方案2】:

    一个简单的中间件可能比在每个视图中都设置它做得更好。这是我用的。

    class SessionExpiry(object):
        """ Set the session expiry according to settings """
        def process_request(self, request):
            if getattr(settings, 'SESSION_EXPIRY', None):
                request.session.set_expiry(settings.SESSION_EXPIRY)
            return None
    

    这取决于在您的配置中设置的SESSION_EXPIRY。格式与request.session.set_expiry相同。

    MIDDLEWARE_CLASSES 的定义应牢记此顺序:

    MIDDLEWARE_CLASSES = (
        ...
        'django.contrib.sessions.middleware.SessionMiddleware',
        '<yourproject>.<yourapp>.middleware.SessionExpiry',
        ...
    }
    

    如果django.contrib.sessions默认考虑这个设置就好了。

    【讨论】:

    • 你错过了 SmileyChris 的回答吗? SESSION_SAVE_EVERY_REQUEST 完全可以做到这一点,无需任何自定义中间件。
    • 是的,但是只有在一个视图中调用 set_expiry 需要您的所有用户点击设置到期的特定视图。您的用户不太可能通过此特定视图进行汇集。使用中间件,您可以在视图之外抽象出这个过期集。如果他的回答对你有用,那很酷。我只是认为这可能是一种更清洁的方式,这就是我选择的方式。
    • 我认为您误解了答案。 SESSION_SAVE_EVERY_REQUEST 完全按照您正在做的事情而无需任何特定于视图的代码。我只是指出你重新发明了轮子。
    • 该设置强制更新到期,是的,但它没有设置到期。所以不,它不会做完全相同的事情。我的中间件允许您将到期时间设置为任意值。
    • 虽然SESSION_SAVE_EVERY_REQUEST 在您想要全局过期策略时很有用,但定义自定义中间件允许您对其进行更多自定义。例如,如果请求来自用户标记为“受信任”的 IP,它可以将其设置为永不过期(或设置为非常长的值,在每次请求时更新)。否则,它可以将其设置为一个短值。等等。所以这并不完全是“重新发明轮子”,而是一种在某些情况下有用的替代方法。
    猜你喜欢
    • 2017-12-02
    • 2018-07-31
    • 2011-10-22
    • 1970-01-01
    • 2021-09-02
    • 2014-11-26
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多