#django #django-debug-toolbar
Вопрос:
запрос.пользователь выдает AttributeError: 'WSGIRequest' object has no attribute 'user'
ошибку, когда я пытаюсь использовать его в своем settings.py файл. Я делаю что-то не так?
Settings.py:
def show_toolbar(request):
if DEBUG:
return True
#if not request.is_ajax() and request.user and request.user.UserSettings.debugger:
# return True
return False
DEBUG_TOOLBAR_CONFIG = {
'SHOW_TOOLBAR_CALLBACK': 'acacia2.settings.show_toolbar',
}
Комментарии:
1. Чувак, с чего я могу начать? Пожалуйста, сначала внимательно прочитайте документы. TLDR; Настройки устанавливаются статически перед любым подключением к серверу, поэтому вы не можете получить запрос внутри чего-то, что должно быть статичным до запуска сервера. Настройки устанавливаются для каждого запуска сервера, а не для каждого запроса. Рассматривать это как конфигурацию перед запуском сервера. Еще раз, пожалуйста, прочитайте доки перед фактическим кодированием. Это сделает стек менее грязным. Овации
2. @quqa123, хотя то, что вы говорите о настройках, устанавливаемых при запуске сервера, верно. Однако операция определяет функцию обратного вызова. Параметр просто указывает на функцию обратного вызова, чтобы ее можно было использовать позже, на основе каждого запроса.
Ответ №1:
Я не могу сказать наверняка, не видя вашего списка промежуточного программного обеспечения, но я подозреваю, что происходит именно это:
Почему это не работает
user
Атрибут устанавливаетсяcontrib.auth
промежуточным программным обеспечением.- Функция, которую вы определили выше, вызывается промежуточным программным обеспечением django-debug-toolbar.
Если ваше промежуточное программное обеспечение django-debug-toolbar находится перед contrib.auth
промежуточным программным обеспечением в списке промежуточного программного обеспечения, определенного в MIDDLEWARE
настройках, то, когда запрос достигнет вашего промежуточного программного обеспечения debug-toolbar, на нем еще не будет установлен объект пользователя. Отсюда и ваша ошибка ( 'WSGIRequest' object has no attribute 'user'
).
Как это исправить
Убедитесь, что промежуточное программное обеспечение django-debug-toolbar следует за промежуточным программным обеспечением аутентификации, например:
MIDDLEWARE = [
...
'django.contrib.auth.middleware.AuthenticationMiddleware',
...
'debug_toolbar.middleware.DebugToolbarMiddleware',
...
]
Комментарии:
1. Я не думаю, что все это сработает, так как он пытается вызвать представление внутри settings.py
2. Нет, он не вызывает функцию внутри настроек. Он определяет функцию внутри настроек. Когда запрос проходит через промежуточное программное обеспечение панели инструментов отладки, он ищет значение
SHOW_TOOLBAR_CALLBACK
-, которое является строкой. Промежуточное программное обеспечение импортирует функцию изsettings.py
, и именно внутри промежуточного программного обеспечения затем вызывается функция (с объектом запроса). Это совершенно законно.