[英]'AnonymousUser' object has no attribute '_meta' in Django
[英]Django 'AnonymousUser' object has no attribute '_meta'
我在我的 Django 应用程序中使用社交登录。 所以,我在我的settings.py
文件中添加了额外的后端。
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'social_core.backends.open_id.OpenIdAuth',
'social_core.backends.google.GoogleOpenId',
'social_core.backends.google.GoogleOAuth2',
'social_core.backends.google.GoogleOAuth',
'social_core.backends.twitter.TwitterOAuth',
'social_core.backends.facebook.FacebookOAuth2',
'social_core.backends.github.GithubOAuth2',
]
我还使用UserCreationForm
进行注册,
class SignupForm(UserCreationForm):
first_name = forms.CharField(max_length=30, required=True, help_text='Required.')
last_name = forms.CharField(max_length=30, required=True, help_text='Required.')
email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2' )
这是视图文件,
def signup(request):
if request.method == 'POST':
form = SignupForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
raw_pass = form.cleaned_data.get('password')
user = authenticate(request, username=username, password=raw_pass)
login(request,user,backend='django.contrib.auth.backends.ModelBackend')
url = reverse('location:get_location')
print("location_url ", url)
return HttpResponseRedirect(url)
else:
form = SignupForm()
return render(request, 'signup.html', {'form':form})
现在,当我单击表单上的注册按钮时出现此错误,
'AnonymousUser' object has no attribute '_meta'
在线上,
login(request,user,backend='django.contrib.auth.backends.ModelBackend')
为什么这样 ?
我可以在我的管理面板中看到该用户已被保存。
是什么导致了这个错误? 以及如何解决?
编辑 -
Internal Server Error: /signup/
Traceback (most recent call last):
File "/home/luvpreet/Envs/weather/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/home/luvpreet/Envs/weather/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/luvpreet/Envs/weather/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/luvpreet/Desktop/drf-vogo/weather/weather/pilot/views.py", line 45, in signup
login(request,user,backend='django.contrib.auth.backends.ModelBackend')
File "/home/luvpreet/Envs/weather/local/lib/python2.7/site-packages/django/contrib/auth/__init__.py", line 154, in login
request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
File "/home/luvpreet/Envs/weather/local/lib/python2.7/site-packages/django/utils/functional.py", line 239, in inner
return func(self._wrapped, *args)
AttributeError: 'AnonymousUser' object has no attribute '_meta'
保存表单时您已经拥有用户,因此您不需要调用authenticate
,因为您在调用login()
时已经提供了后端:
user = form.save()
login(request, user, backend='django.contrib.auth.backends.ModelBackend')
来这里寻找这个错误。 我们的堆栈是 django-oscar + wagtail。 事实证明,我们从AUTHENTICATION_BACKENDS
中删除了oscar.apps.customer.auth_backends.EmailBackend
。 放回去解决了这个问题。
UserCreationForm() 提供密码和密码确认字段。 在这种情况下,身份验证失败,因为您试图获取不存在的“密码”,因此将用户返回为无。 如果你打印 form.cleaned_data,你会得到一个类似这样的字典
{'username': 'myuser', 'password1': 'pass1234', 'password2': 'pass1234'}
更改 raw_pass 行应该可以解决问题:
raw_pass = form.cleaned_data.get('password1')
返回无的原因从注册表单中使用创建的用户登录时,在数据库中它正在使用加密密码检查特定用户,但我们正在以文本形式保存密码,这就是为什么如果您提供正确的用户名和密码,它会失败
在 setting.py 文件中添加以下模型后端
AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',)
或将后端传递给登录功能本身
login(request, username,password, backend='django.contrib.auth.backends.ModelBackend')
导入 make_password 函数并将来自注册表的密码传递给它,然后它将密码以加密形式保存到 Db 中
from django.contrib.auth.hashers import make_password
raw_pass = form.cleaned_data.get('password') raw_pass = make_password(form.cleaned_data.get('password'))
Django=2.2.4
我相信这是因为您没有对密码进行哈希处理。 这对我有用。 尝试:
user = userform.save()
user.set_password(user.password)
user.save()
遇到同样的问题(使用 Django 2.2)。
为了解决这个问题,我在MIDDLEWARE
上方的 settings.py 中添加了AUTH_USER_MODEL = 'myapp.MyUser'
。
从关于替换自定义用户模型的2.2 文档中:
" Django 允许您通过为引用自定义模型的 AUTH_USER_MODEL 设置提供一个值来覆盖默认用户模型: AUTH_USER_MODEL = 'myapp.MyUser'
。这个虚线对描述了 Django 应用程序的名称(必须在您的 INSTALLED_APPS 中) ,以及您希望用作用户模型的 Django 模型的名称“
我遇到了同样的问题,因为我自定义了身份验证并且在authenticate()
中传递了错误的参数
您没有共享您的自定义用户模型,但可能是您使用电子邮件作为USERNAME_FIELD
。
class User(AbstractUser):
email = models.EmailField(unique=True)
USERNAME_FIELD = 'email'
因此,在相关视图中,您需要将电子邮件(而不是用户名)作为参数传递给authenticate()
if form.is_valid():
form.save()
email = form.cleaned_data['email']
password = form.cleaned_data['password1']
user = authenticate(request, email=email, password=password)
login(request, user)
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.