Django - 会话到期续订

时间:2018-02-20 22:07:42

标签: python django django-sessions

我只是对使用Django制作网络应用感兴趣,而我正在努力解决有关会话的问题。

我想知道如果用户在一段时间内没有尝试连接到网站(例如15天),如何使会话过期。 换句话说,我想在每次用户会话连接到站点时更新用户会话的到期日期。

我取消了很多网站,但我找不到任何有价值的例子。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

在您的settings.py中设置SESSION_COOKIE_AGE

SESSION_COOKIE_AGE = 15 * 60 # 15 Minutes

在文档https://docs.djangoproject.com/en/2.0/ref/settings/#std:setting-SESSION_COOKIE_AGE

中了解更多信息

答案 1 :(得分:0)

如果您希望会话根据每个请求自动续订,一个好的解决方案是编写中间件,该中间件可以在需要的任何视图中更改要扩展的会话的到期时间。

例如:

from functools import wraps
from [project] import settings

class CookieMiddleware(object):
    """
    This middleware sets the login cookie to update timeout on every request
    """

    def __init__(self, get_response):
        self.get_response = get_response

    @staticmethod
    def process_view(request, view_func, args, kwargs):
        # ensure that we don't want to exclude this from running
        if getattr(view_func, 'cookie_not_important', False):
            print('cookie not important:', view_func.__name__)
            return None

        # the cookie is set, let's now set a new expire time to 30 minutes from now
        print('cookie expiry changed:', view_func.__name__)
        # it is probably smartest to grab this value back from settings
        expire_time = settings.SESSION_COOKIE_AGE
        # expire_time = 30 * 60
        request.session.set_expiry(expire_time)
        return view_func(request, *args, **kwargs)

    def __call__(self, request):
        response = self.get_response(request)
        return response


def cookie_not_important(view_func):
    """
    Decorator used to allow the exclusion of the cookie time being reset
    :param view_func: The view being wrapped
    :return:
    """

    def view_being_wrapped(*args, **kwargs):
        return view_func(*args, **kwargs)

    view_being_wrapped.cookie_not_important = True
    return wraps(view_func)(view_being_wrapped)

现在您可以登录并点击@cookie_not_important以外的任何视图,到期时间将根据settings.py中的当前值进行重置

为了完整起见,这是视图的外观:

from django.urls import reverse

@cookie_not_important
def logout(request):
    del request.session
    return redirect(reverse('some_view_name'))