Django - LoginView: объект 'AnonymousUser' не имеет атрибута _meta - PullRequest
1 голос
/ 05 июня 2019

Я хочу использовать встроенный в Djangos LoginView. Он работает нормально, пока я не войду в систему с правильным паролем (если пароль неправильный, он работает). Тогда я получаю эту ошибку:

'AnonymousUser' object has no attribute '_meta'

Я уже добавил AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend'] в свой файл settings.py и посмотрел на Вход в Django AttributeError: У объекта AnonymousUser нет атрибута _meta и на других веб-страницах, но они не могли мне помочь.

MIDDLEWARE = [
     # Must have middlewares
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',

    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',


    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'simple_history.middleware.HistoryRequestMiddleware',
    'admin_reorder.middleware.ModelAdminReorder',

    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',

     # Custom middlewares
    'utils.Middleware.RangesMiddleware.RangesMiddleware',
    'utils.Middleware.AdminAccessMiddleware.AdminAccessMiddleware',
    'apps.log_request.middlewares.RequestLogMiddleware',
]

.

Internal Server Error: /auth/anmelden
Traceback (most recent call last):
  File "C:\Program Files\Python37\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Program Files\Python37\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Program Files\Python37\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Program Files\Python37\lib\site-packages\django\utils\decorators.py", line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Program Files\Python37\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Program Files\Python37\lib\site-packages\django\utils\decorators.py", line 45, in _wrapper
    return bound_method(*args, **kwargs)
  File "C:\Program Files\Python37\lib\site-packages\django\views\decorators\debug.py", line 76, in sensitive_post_parameters_wrapper
    return view(request, *args, **kwargs)
  File "C:\Program Files\Python37\lib\site-packages\django\utils\decorators.py", line 45, in _wrapper
    return bound_method(*args, **kwargs)
  File "C:\Program Files\Python37\lib\site-packages\django\utils\decorators.py", line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Program Files\Python37\lib\site-packages\django\utils\decorators.py", line 45, in _wrapper
    return bound_method(*args, **kwargs)
  File "C:\Program Files\Python37\lib\site-packages\django\views\decorators\cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "C:\Program Files\Python37\lib\site-packages\django\contrib\auth\views.py", line 61, in dispatch
    return super().dispatch(request, *args, **kwargs)
  File "C:\Program Files\Python37\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "C:\Program Files\Python37\lib\site-packages\django\views\generic\edit.py", line 142, in post
    return self.form_valid(form)
  File "C:\Program Files\Python37\lib\site-packages\django\contrib\auth\views.py", line 90, in form_valid
    auth_login(self.request, form.get_user())
  File "C:\Program Files\Python37\lib\site-packages\django\contrib\auth\__init__.py", line 126, in login
    request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
  File "C:\Program Files\Python37\lib\site-packages\django\utils\functional.py", line 257, in inner
    return func(self._wrapped, *args)
AttributeError: 'AnonymousUser' object has no attribute '_meta'
[05/Jun/2019 21:25:28] "POST /auth/anmelden HTTP/1.1" 500 159900

Эта ошибка возникает на \django\utils\decorators.py в строке 142 (response = view_func(request, *args, **kwargs)) (я использовал PyCharm для отладки). Мой middleware: <django.middleware.csrf.CsrfViewMiddleware object at 0x000002105D119470>, а мой view_func functools.partial(<bound method LoginView.dispatch of <django.contrib.auth.views.LoginView object at 0x000002105F768C50>>).

Мой путь в моем urls.py:

path('anmelden', LoginView.as_view(
        template_name="authenticate/login.html",
        authentication_form=SignInForm,
        extra_context={
            "selected": "authenticate",
            "title": title_suffix("Anmelden", Config.verbose_name),
        },
    ), name="login"),

Моя clean функция в моем SignInForm:

def clean(self):
    User.remove_expired_user()

    cleaned_data = self.cleaned_data # That's the error. I had to use self.clean()!!!!
    username = cleaned_data.get("username")
    password = cleaned_data.get("password")

    if "@" in username:
        try:
            username = User.objects.get(email__iexact=username).username
        except ObjectDoesNotExist:
            raise forms.ValidationError("Diese E-Mail-Adresse wurde nicht gefunden")
    else:
        try:
            username = User.objects.get(username=username).username
        except ObjectDoesNotExist:
            raise forms.ValidationError("Dieser Benutzername wurde nicht gefunden")

    user = authenticate(username=username, password=password)

    if user is None:
        try:
            us = User.objects.get(username=username)
        except ObjectDoesNotExist:
            pass
        else:
            if us.check_password(password) and not us.is_active:
                raise forms.ValidationError("Dieser Account ist deaktiviert. Du kannst ihn über deine E-Mail aktivieren.")
        raise forms.ValidationError("Falsches Passwort")
    return cleaned_data

Я НАШЕЛ ОШИБКУ:

В моей функции clean я использовал self.cleaned_data вместо self.clean().

1 Ответ

0 голосов
/ 13 июня 2019

Найдите каталог на вашем компьютере, откуда загружается Django.

python -c "import sys; print([p for p in sys.path if 'site-packages' in p])"

Откройте этот каталог и найдите django. Вставьте import pdb; pdb.set_trace() в https://github.com/django/django/blob/a8e2a9bac6e548d6ab2e13af6171d2fdd3b8055b/django/contrib/auth/init.py#L72 и проходите проверку каждого шага по пути. Где-то в этом процессе вы должны прийти к точке, в которой вы ожидаете модель User, но получаете модель AnonymousUser. Как только вы найдете эту точку, вам будет легче выяснить «почему» за ней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...