我只是对使用Django制作网络应用感兴趣,而我正在努力解决有关会话的问题。
我想知道如果用户在一段时间内没有尝试连接到网站(例如15天),如何使会话过期。 换句话说,我想在每次用户会话连接到站点时更新用户会话的到期日期。
我取消了很多网站,但我找不到任何有价值的例子。
非常感谢您的帮助。
答案 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'))