Python 在没有页面加载的情况下会话超时时更新表记录 已安装的pip安装django会话超时

Python 在没有页面加载的情况下会话超时时更新表记录 已安装的pip安装django会话超时,python,django,python-3.x,Python,Django,Python 3.x,像这样更新setting.py MIDDLEWARE_CLASSES = [ # ... 'django.contrib.sessions.middleware.SessionMiddleware', 'caccounts.middleware.SessionTimeoutMiddleware', # custom middleware # ... ] 并加入: SESSION_EXPIRE_SECONDS = 3600 # 1 hour SESSION_EXPIRE_AFTER_LAST

像这样更新setting.py

MIDDLEWARE_CLASSES = [
# ...
'django.contrib.sessions.middleware.SessionMiddleware',
'caccounts.middleware.SessionTimeoutMiddleware', # custom middleware
# ... ]
并加入:

SESSION_EXPIRE_SECONDS = 3600  # 1 hour
SESSION_EXPIRE_AFTER_LAST_ACTIVITY = True
我在自定义中间件中编写了一些代码,如下所示

current_user = request.user  
user = User.objects.get(pk=current_user.id)  
user.is_online = False    
user.save()   

仅当我加载页面时才更新其状态,但我想在超时会话时自动更新状态

据我所知,您需要这样编写中间件:

class CustomMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response


    def __call__(self, request):
        if not hasattr(request, 'session') or request.session.is_empty():
            return

        init_time = request.session.setdefault(SESSION_TIMEOUT_KEY, time.time())

        expire_seconds = getattr(
            settings, 'SESSION_EXPIRE_SECONDS', settings.SESSION_COOKIE_AGE)

        session_is_expired = time.time() - init_time > expire_seconds
        current_user = request.user
        user = User.objects.get(pk=current_user.id)  
        if session_is_expired:
           user.is_online = False    
           user.save()
        # put next block of code if necessary
        # else:
        #   if user.is_online == False:
        #      user.is_online = True
        #      user.save()   
        response = self.get_response(request)
        return response

FYI您需要在settings.py中的
django\u session\u timeout.middleware.SessionTimeoutMiddleware'
之前放置此
自定义中间件
,因为
SessionTimeoutMiddleware
会在超时后刷新会话。

谢谢您提供的信息,但状态仅在我登录而不是会话时更新超时。我需要在会话到期时自动显示状态。我认为,为此,您需要编写某种cronjob。你可以看看芹菜