Объект WSGIRequest не имеет пользователя атрибута в функции промежуточного программного обеспечения

У меня есть следующая промежуточная функция:

class LastVisitMiddleware(object):
    def process_response(self, request, response):
        if request.user.is_authenticated():
            customer = get_customer(request)
            Customer.objects.filter(pk=customer.pk).update(last_visit=now())
        return response

Мои записи промежуточного программного обеспечения выглядят так:

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',
    'my.middleware.LastVisitMiddleware',

)

Мой URL-адрес выглядит так:

url(r'^dashboard/$', views.dashboard, name='dashboard'),

Когда я перехожу к URL-адресам с косой чертой, страница загружается нормально. Когда я опускаю косую черту, я получаю сообщение об ошибке:

Объект WSGIRequest не имеет пользователя атрибута

Когда я удаляю промежуточное ПО, у меня не возникает проблем, использую ли я косую черту или нет.

Как я могу предотвратить появление этой ошибки с косой чертой или без нее?


person Atma    schedule 19.02.2015    source источник


Ответы (2)


Я знаю, что Django перенаправляет любые URL-адреса без конечного /, поэтому /home на /home/, но я не уверен, когда Django делает это перенаправление (очевидно, после запуска промежуточного программного обеспечения?). Один из способов обойти это — проверить, установлен ли объект user;

if hasattr(request, 'user') and request.user.is_authenticated():

Это должно решить вашу проблему.

person vishen    schedule 19.02.2015
comment
Похоже, вы правы; по умолчанию перенаправление произойдет до запуска AuthenticationMiddleware. Я только что столкнулся с той же проблемой при выполнении запроса без косой черты, и добавление косой черты исправило ее. Спасибо! - person Joey Wilhelm; 15.07.2015

На этапах ответа (промежуточное ПО process_response() и process_exception()) классы применяются в обратном порядке, снизу вверх.

аналогичный вопрос:

Django: объект WSGIRequest не имеет атрибута "пользователь" на несколько страниц?

person James Lin    schedule 19.02.2015