【问题标题】:Autologout a user after specific time in django在 django 中的特定时间后自动注销用户
【发布时间】:2015-10-18 15:36:26
【问题描述】:

我需要在某个特定时间后注销用户(现在假设为 1 分钟),因此创建了一个中间件类,如下所示

myproject/middleware.py

from datetime import datetime, timedelta
from django.contrib import auth


class AutoLogout:
  def process_request(self, request):
    if not request.user.is_authenticated() :
      #Can't log out if not logged in
      return

    try:
      if datetime.now() - request.session['last_touch'] > timedelta( 0, settings.AUTO_LOGOUT_DELAY * 60, 0):
        auth.logout(request)
        del request.session['last_touch']
        return
    except KeyError:
      pass

    request.session['last_touch'] = datetime.now()

settings.py

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'myproject.middleware.HttpErrorHandler',
    'myproject.middleware.AutoLogout'
)
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
AUTO_LOGOUT_DELAY = 1

Djagno 版本是1.4.12

但上面的代码不起作用,我不确定我做错了什么,所以有人可以告诉我为什么上面的代码不起作用以及如何每 1 分钟或 5 分钟注销用户?

【问题讨论】:

  • 您是否在“尝试”块中遇到任何异常?
  • 你能不能输入一些日志来看看你是否进入了 try、if 内部等等。
  • 实际上它似乎没有进入 process_request 方法,因为我使用了一些打印语句但无法在终端输出上看到
  • @DanielRoseman 甚至没有进入 process_request 方法
  • 也许你应该使用 jquery ajax,它会发送 GET 或 POST 请求,在特定时间运行一些视图,这将注销用户..

标签: django django-sessions django-middleware


【解决方案1】:

从 Django 1.7 开始引入Session management。在设置下,您可以添加两个参数来帮助您允许自动注销,而不必编写自己的中间件。

  1. SESSION_EXPIRE_AT_BROWSER_CLOSE
  2. SESSION_COOKIE_AGE

希望能回答您的问题。编码愉快!

【讨论】:

    猜你喜欢
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2014-10-25
    • 2018-02-23
    相关资源
    最近更新 更多