代码之家  ›  专栏  ›  技术社区  ›  Luv33preet

Django“AnonymousUser”对象没有属性“u meta”

  •  28
  • Luv33preet  · 技术社区  · 8 年前

    我在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'
    
    7 回复  |  直到 8 年前
        1
  •  39
  •   Alasdair    8 年前

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

    user = form.save()
    login(request, user, backend='django.contrib.auth.backends.ModelBackend')
    
        2
  •  2
  •   khink    8 年前

    来这里寻找这个错误。我们的堆栈是django oscar+wagtail。结果是我们删除了 oscar.apps.customer.auth_backends.EmailBackend AUTHENTICATION_BACKENDS . 把它放回去解决了这个问题。

        3
  •  1
  •   sostom    7 年前

    如果您打印表单。清理完数据后,你会得到一个类似的字典

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

    更改raw_传递线应该可以解决这个问题:

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

        4
  •  1
  •   abhishek Singh    6 年前

    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
  •  1
  •   Display name    6 年前

    AUTH_USER_MODEL = 'myapp.MyUser' 设置。py以上 MIDDLEWARE .

    2.2 Docs 替换自定义用户模型时:

    “Django允许您通过提供引用自定义模型的AUTH\u user\u model设置值来覆盖默认用户模型: AUTH\u USER\u MODEL='我的应用程序。我的用户' . 这对虚线描述了Django应用程序的名称(必须在您安装的应用程序中),以及您希望用作用户模型的Django模型的名称。“

        6
  •  1
  •   Diego Venâncio    4 年前

            user = userform.save()
            user.set_password(user.password)
            user.save()
    
        7
  •  0
  •   Mirza Haider    4 年前

    我遇到了同样的问题,因为我有自定义的身份验证,并且传入了错误的参数 authenticate()

    您没有共享您的自定义用户模型,但可能是您使用电子邮件作为 USERNAME_FIELD .

    class User(AbstractUser):
        email = models.EmailField(unique=True)
        USERNAME_FIELD = 'email'
    

        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)
        ...