Декоратор login_required выдает ошибку "объект не имеет атрибута 'user'"
Новичок в Django. У меня есть представление, которое хорошо работает без декоратора @login_required.
urls.py
urlpatterns = [
path('play/', play.as_view(), name='play'),
view.py с закомментированным @login_required
from django.contrib.auth.decorators import login_required
.
.
class play(View):
#@login_required
def get(self, request, *args, **kwargs):
print("GET request: ", request)
return render(request, 'play.html', {})
**EDIT:**добавление записей в setup.py
LOGIN_URL = 'home'
LOGIN_REDIRECT_URL = 'home'
LOGOUT_REDIRECT_URL = 'home'
Страница корректно загружается в браузере, а запрос выводится на консоль следующим образом
GET request: <WSGIRequest: GET '/play/'>
[16/Aug/2021 23:17:23] "GET /play/ HTTP/1.1" 200 3591
[16/Aug/2021 23:17:23] "GET /static/css/home.css HTTP/1.1" 200 96
[16/Aug/2021 23:17:23] "GET /static/js/home.js HTTP/1.1" 200 3544
[16/Aug/2021 23:17:23] "GET /static/js/main.js HTTP/1.1" 200 1451443
[16/Aug/2021 23:17:23] "GET /static/images/BlankPicture.png HTTP/1.1" 200 16272
Not Found: /favicon.ico
[16/Aug/2021 23:17:24] "GET /favicon.ico HTTP/1.1" 404 7793
OTOH, если я удалю строку @login_required, я получу следующую ошибку.
AttributeError at /play/
'play' object has no attribute 'user'
Request Method: GET
Request URL: http://127.0.0.1:8000/play/
Django Version: 2.2.12
Exception Type: AttributeError
Exception Value:
'play' object has no attribute 'user'
Exception Location: /usr/lib/python3/dist-packages/django/contrib/auth/decorators.py in _wrapped_view, line 20
Python Executable: /usr/bin/python3
Python Version: 3.8.10
Python Path:
['/home/<username>/workspace/djangoapp/src',
'/usr/lib/python38.zip',
'/usr/lib/python3.8',
'/usr/lib/python3.8/lib-dynload',
'/usr/local/lib/python3.8/dist-packages',
'/usr/lib/python3/dist-packages']
Server time: Mon, 16 Aug 2021 23:20:17 +0000
play.html - это ванильная html-страница, содержащая только статический html. Ошибка возникает, даже если я вхожу в систему на другой вкладке.
Я вижу, что ошибка происходит в ....django/contrib/auth/decorators.py строка 20
@wraps(view_func)
def _wrapped_view(request, *args, **kwargs):
if test_func(request.user): <<<Here is the error
Во всех остальных представлениях я сначала проверяю, является ли пользователь is_authenticated, а затем успешно использую user.request. Я хотел убрать этот цикл if-else и упростить мои представления, используя декоратор @login_required.
Я следую документации здесь Декоратор login_required Где моя ошибка?
EDIT: Я хочу перенаправить пользователя на 'home' url, если он не вошел в систему.
Эта ошибка возникает из-за того, что login_required
читает self
(который является объектом представления play
, как описано в ошибке) вместо request
, когда используется как декоратор для представления внутри класса.
Поскольку это представление на основе классов, login_required
используется по-разному:
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
@method_decorator(login_required, name='dispatch')
class play(View):
...
Вы также можете использовать LoginRequiredMixin, который работает аналогичным образом:
from django.contrib.auth.mixins import LoginRequiredMixin
class play(LoginRequiredMixin, View):
...