繁体   English   中英

Django 'AnonymousUser' 对象没有属性 '_meta'

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM