【问题标题】:Django 'AnonymousUser' object has no attribute '_meta'Django 'AnonymousUser' 对象没有属性 '_meta'
【发布时间】:2022-03-12 19:10:25
【问题描述】:

我在我的 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'

【问题讨论】:

  • @Alasdair 请检查堆栈跟踪,from django.contrib.auth import login, authenticate

标签: python django


【解决方案1】:

您在保存表单时已经拥有用户,因此您无需调用authenticate,因为您在调用login()时已经提供了后端:

user = form.save()
login(request, user, backend='django.contrib.auth.backends.ModelBackend')

【讨论】:

    【解决方案2】:

    来到这里寻找这个错误。我们的堆栈是 django-oscar + wagtail。事实证明,我们从AUTHENTICATION_BACKENDS 中删除了oscar.apps.customer.auth_backends.EmailBackend。放回去解决了这个问题。

    【讨论】:

      【解决方案3】:

      UserCreationForm() 提供密码和密码确认字段。 在这种情况下,身份验证失败,因为您试图获取不存在的“密码”,因此将用户返回为无。 如果你打印 form.cleaned_data,你会得到一个类似的字典

      {'username': 'myuser', 'password1': 'pass1234', 'password2': 'pass1234'}

      更改 raw_pass 行应该可以解决问题:

      raw_pass = form.cleaned_data.get('password1')

      【讨论】:

        【解决方案4】:

        返回无的原因从注册表单中使用创建的用户登录时,在 DB 中它正在使用加密密码检查特定用户,但我们正在以文本形式保存密码,这就是为什么如果您提供正确的用户名和密码,它会失败

        在 setting.py 文件中添加以下模型后端

        AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',)

        或将后端传递给登录功能本身

        login(request, username,password, backend='django.contrib.auth.backends.ModelBackend')

        导入make_password函数并传递来自注册表的密码,然后它将密码以加密形式保存到数据库中

        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

        【讨论】:

          【解决方案5】:

          遇到了同样的问题(使用 Django 2.2)。

          为了解决这个问题,我在MIDDLEWARE上方的settings.py中添加了AUTH_USER_MODEL = 'myapp.MyUser'

          来自2.2 Docs 关于替换自定义用户模型:

          " Django 允许您通过为引用自定义模型的 AUTH_USER_MODEL 设置提供一个值来覆盖默认用户模型:AUTH_USER_MODEL = 'myapp.MyUser'。这个虚线对描述了 Django 应用程序的名称(必须在您的 INSTALLED_APPS 中),以及您希望用作用户模型的 Django 模型的名称"

          【讨论】:

            【解决方案6】:

            我相信这是因为您没有对密码进行哈希处理。这对我有用。试试:

                    user = userform.save()
                    user.set_password(user.password)
                    user.save()
            

            【讨论】:

              猜你喜欢
              • 2019-10-21
              • 1970-01-01
              • 2017-05-27
              • 2021-12-19
              • 1970-01-01
              • 2020-10-05
              • 1970-01-01
              • 2019-03-19
              • 2021-08-03
              相关资源
              最近更新 更多