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_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()
。
在您的计算机上找到从中加载 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"。
我想使用 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_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()
。
在您的计算机上找到从中加载 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"。