создание собственного промежуточного программного обеспечения не работает в Django? - PullRequest
1 голос
/ 02 октября 2019

Здесь я пытаюсь обновить последнее посещение пользователя, используя пользовательское промежуточное ПО. Но это не работает. Это не обновляет время 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)

просмотров. 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',

1 Ответ

0 голосов
/ 02 октября 2019

Убедитесь, что ваше промежуточное ПО идет после 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',
]
...