【问题标题】:override create_user() function used by third party app social-auth-app-django覆盖第三方应用程序 social-auth-app-django 使用的 create_user() 函数
【发布时间】:2021-02-14 01:29:53
【问题描述】:

您好,我有一个项目,我在其中创建了自己的用户模型,继承自 BaseUserManager。

class MyAccountManager(BaseUserManager):
    def create_user(self, email, first_name, last_name, password=None):
        if not email:
            raise ValueError('Este es un campo requerido')
        if not first_name:
            raise ValueError('Este es un campo requerido')
        if not last_name:
            raise ValueError('Este es un campo requerido')

        user = self.model(
            email=self.normalize_email(email),
            first_name=first_name,
            last_name=last_name,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, first_name, last_name, password):
        user = self.create_user(
            email=self.normalize_email(email),
            password=password,
            first_name=first_name,
            last_name=last_name,
        )
        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user``

现在我还想为用户添加通过 facebook 登录的选项,但它给了我一个例外,说 create_user() 缺少 2 个必需的位置参数:“first_name”和“last_name”,因为我修改了模型以要求这些字段而不是用户名和其他更改。如何使它能够与我的自定义用户模型一起正常工作?

这是完整的回溯:

Traceback:

File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\django\core\handlers\exception.py" in inner
      34.             response = get_response(request)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\django\core\handlers\base.py" in _get_response
      115.                 response = self.process_exception_by_middleware(e, request)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\django\core\handlers\base.py" in _get_response
      113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func
      44.         response = view_func(request, *args, **kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view
      54.         return view_func(*args, **kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_django\utils.py" in wrapper
      49.             return func(request, backend, *args, **kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_django\views.py" in complete
      31.     return do_complete(request.backend, _do_login, user=request.user,
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\actions.py" in do_complete
      45.         user = backend.complete(user=user, *args, **kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\backends\base.py" in complete
      40.         return self.auth_complete(*args, **kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\utils.py" in wrapper
      251.             return func(*args, **kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\backends\facebook.py" in auth_complete
      111.         return self.do_auth(access_token, response, *args, **kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\backends\facebook.py" in do_auth
      153.         return self.strategy.authenticate(*args, **kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_django\strategy.py" in authenticate
      107.         return authenticate(*args, **kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\django\contrib\auth\__init__.py" in authenticate
      73.             user = backend.authenticate(request, **credentials)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\backends\base.py" in authenticate
      80.         return self.pipeline(pipeline, *args, **kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\backends\base.py" in pipeline
      83.         out = self.run_pipeline(pipeline, pipeline_index, *args, **kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\backends\base.py" in run_pipeline
      113.             result = func(*args, **out) or {}
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\pipeline\user.py" in create_user
      75.         'user': strategy.create_user(**fields)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\strategy.py" in create_user
      53.         return self.storage.user.create_user(*args, **kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_django\storage.py" in create_user
      80.                     user = cls.user_model().objects.create_user(*args, **kwargs)
    
    Exception Type: TypeError at /oauth/complete/facebook/
    Exception Value: create_user() missing 2 required positional arguments: 'first_name' and 'last_name'

【问题讨论】:

  • 那么问题在于,Facebook 可能不提供first_namelast_name。您可以使参数可选,接受用户名,然后实现一些逻辑来派生firstnamelastname(最简单的可能是将用户名分配为名字并将姓氏留空)。
  • 它确实提供了 first_name 和 last_name 但它没有将其传递给 create_user() 函数。我不知道如何让它做到这一点。
  • 请提供您的型号/经理的代码。

标签: python django django-socialauth


【解决方案1】:

我只是在阅读了库中的一堆文件后才发现它,原来你只需要将以下代码行 USER_FIELDS = ['field1', 'field2', ... , 'fieldn'] 添加到你的 settings.py 文件中,以便告诉应用你已经修改create_user() 函数获取USER_FIELDS 中的字段。

【讨论】:

    猜你喜欢
    • 2017-07-14
    • 2020-05-29
    • 1970-01-01
    • 2018-05-22
    • 2021-02-06
    • 2020-10-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    相关资源
    最近更新 更多