【问题标题】:User without username with allauth, rest_auth and facebook没有用户名的用户,带有 allauth、rest_auth 和 facebook
【发布时间】:2015-05-20 23:02:40
【问题描述】:

我有一个带有 django-rest-framework、rest-auth、allauth 和 facebook Oauth2 的设置。我的问题是,当我使用 facebook 端点创建用户时,创建了社交用户,还创建了 django 用户,但两者都没有用户名。我应该在某处配置它吗?

【问题讨论】:

  • 我遇到了类似的问题,是否有其他用户的 facebook 帐户电子邮件重复?
  • 不,只有一个,我的,因为我还在开发它。我真的不想研究源代码。希望没有实现。
  • 好的,那么不同的问题。祝你好运!
  • 您是否设置了 ACCOUNT_USERNAME_REQUIRED = True?还要检查此设置 SOCIALACCOUNT_AUTO_SIGNUP。我相信您需要将其设置为 false。
  • 有完全相同的问题。有什么解决办法吗?

标签: django facebook rest


【解决方案1】:

username 字段不再存在,因为一年前它已被 Graph API v2.0 弃用...

/me/username 不再可用。

检查您是否使用的是最新版本的库。

【讨论】:

  • 那我该如何设置自定义用户名呢?空的用户名使管理员难以使用。
  • 这不是解决方案。
【解决方案2】:

您可以通过覆盖 DefaultSocialAccountAdapter 来设置自定义用户名 我刚刚从 email 中删除了 @ 并替换为 _ 以生成用户名

#in setting added this

SOCIALACCOUNT_ADAPTER = 'trip2.users.adapter.SocialAdapter'

# and then override the Adapter

class SocialAdapter(DefaultSocialAccountAdapter):


    def populate_user(self,
                  request,
                  sociallogin,
                  data):
    """
    Hook that can be used to further populate the user instance.

    For convenience, we populate several common fields.

    Note that the user instance being populated represents a
    suggested User instance that represents the social user that is
    in the process of being logged in.

    The User instance need not be completely valid and conflict
    free. For example, verifying whether or not the username
    already exists, is not a responsibility.
    """
    username = data.get('username')
    first_name = data.get('first_name')
    last_name = data.get('last_name')
    email = data.get('email')
    name = data.get('name')
    user = sociallogin.user
    emailtouname = email.split('@')[0] + "_" + email.split('@')[1].split('.')[0]

    user_email(user, valid_email_or_none(email) or '')
    name_parts = (name or '').partition(' ')
    user_field(user, 'first_name', first_name or name_parts[0])
    user_field(user, 'last_name', last_name or name_parts[2])
    user_username(user, username or emailtouname)
    return user

【讨论】:

    【解决方案3】:

    您可以传递“用户名”密钥以及通过 Facebook API 检索到的其他数据。或者您可以深入研究 allauth/socialaccount/adapter.py populate_user() 方法并自定义“用户名”字段(我只是使其等于用户电子邮件)

    【讨论】:

      猜你喜欢
      • 2016-08-22
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      相关资源
      最近更新 更多