Django - 登录视图:'AnonymousUser' 对象没有属性“_meta”

Django - LoginView: 'AnonymousUser' object has no attribute '_meta'

我想使用 Djangos 的内置 LoginView。它工作正常,直到我使用正确的密码登录用户(如果密码错误它工作)。然后我得到这个错误:

'AnonymousUser' object has no attribute '_meta'

我已经将 AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend'] 添加到我的 settings.py 并且我查看了 和其他网页,但他们无法帮助我。

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

这个错误出现在第142行\django\utils\decorators.py处(response = view_func(request, *args, **kwargs))(我是用PyCharm调试的)。我的 middleware 是:<django.middleware.csrf.CsrfViewMiddleware object at 0x000002105D119470> 我的 view_funcfunctools.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()

在您的计算机上找到从中加载 Django 的目录。

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

打开该目录并找到 django。在 https://github.com/django/django/blob/a8e2a9bac6e548d6ab2e13af6171d2fdd3b8055b/django/contrib/auth/init.py#L72 处插入一个 import pdb; pdb.set_trace() 并逐步检查沿途的每个步骤。在该过程中的某个地方,您应该达到期望用户模型但获得匿名用户模型的地步。一旦找到那个点,就更容易找出它后面的"why"。