【问题标题】:creating custom middleware not working in django?创建自定义中间件在 Django 中不起作用?
【发布时间】:2019-10-02 07:38:41
【问题描述】:

这里我尝试使用自定义中间件更新用户的上次访问。但这不起作用。它没有更新数据库中的 last_visit 时间。

我在这里做错了什么?

models.py

class Staff(models.Model):
    user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE, related_name='staff')
    name = models.CharField(max_length=255, blank=True, null=True)
    last_visit = models.DateTimeField(default=now(), blank=True)

views.py

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

    def __call__(self, request):
        if request.user.is_authenticated:
            Staff.objects.filter(pk=request.user.pk).update(last_visit=now())

    response = self.get_response(request)
    return response

settings.py

MIDDLEWARE = [
    'organization.views.CheckUserLastVisitMiddleware',

【问题讨论】:

  • 无关,但是这个Staff.objects.filter(pk=request.user.pk)是错误的-Staff有它自己的pk,它和User.pk不一样,所以你没有更新正确的Staff记录(s ) (或者,如果发生,那只是偶然)。正确的查询是Staff.objects.filter(user=request.user)
  • @brunodesthuilliers 之前是User.objects.filter(pk=request.user.pk).update(staff__last_visit=now()),它说没有staff__last_visit 的文件名,所以我改成了这个。谢谢,现在我会改成那个
  • 我可以建议您read this 并三思而后行吗?

标签: django middleware


【解决方案1】:

确保您的中间件位于设置中的 AuthenticationMiddleware 之后。否则request.user.is_authenticated 将永远是False

https://docs.djangoproject.com/en/2.2/topics/http/middleware/#activating-middleware

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    # your middleware should be added here or even further down
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

【讨论】:

  • 我已经添加到最后了
猜你喜欢
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
相关资源
最近更新 更多