Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在使用django和django social auth时,如何向用户显示设置用户名的表单_Python_Django_Django Socialauth_Socialauth - Fatal编程技术网

Python 在使用django和django social auth时,如何向用户显示设置用户名的表单

Python 在使用django和django social auth时,如何向用户显示设置用户名的表单,python,django,django-socialauth,socialauth,Python,Django,Django Socialauth,Socialauth,我一直在使用django social auth(https://github.com/omab/django-social-auth),并取得了一些成功——从Twitter和Facebook登录已经很容易地建立起来了。然而,当我从一些OpenID提供商登录时,我面临一个空的用户名变量,而social auth应用程序允许这样做(尽管我已经设置了social_auth_DEFAULT_username) 虽然如果SOCIAL_AUTH_DEFAULT_USERNAME工作正常,这可能是一个临时解

我一直在使用django social auth(https://github.com/omab/django-social-auth),并取得了一些成功——从Twitter和Facebook登录已经很容易地建立起来了。然而,当我从一些OpenID提供商登录时,我面临一个空的用户名变量,而social auth应用程序允许这样做(尽管我已经设置了social_auth_DEFAULT_username)

虽然如果SOCIAL_AUTH_DEFAULT_USERNAME工作正常,这可能是一个临时解决方案,但理想情况下,我宁愿它由openID提供程序自动设置。基本上,我只剩下两种可能的解决方案:

1) 创建一个自定义方法来提取从openID提供程序发送的一些额外数据,从而从中设置用户名。 2) 强制用户在首次登录时设置用户名

虽然(2)不那么优雅,但它可以确保每次都插入用户名,并且还避免了对自动信息进行某些后处理的需要,这些信息可能不适合用户名的格式

我的问题是,我该如何着手实施上述任何一项!完整的答案是没有必要的,但一个方法的指针将不胜感激

另一种选择是玩django socialregistration,看看这是否会让生活更轻松


J

1可能是正确的选择。您可以覆盖后端类的get_user_details方法,用于您遇到问题的社交提供商,并从中提取用户名

它看起来像这样,比如Facebook:

from social_auth.backends.facebook import FacebookBackend
class CustomFacebookBackend(FacebookBackend):
    name = 'facebook'

    def get_user_details(self, response):
        """Return user details from Facebook account"""
        return {'username': response['name'],
                'email': response.get('email', ''),
                'first_name': response.get('first_name', ''),
                'last_name': response.get('last_name', '')}
“response”变量是从请求返回给OAuth提供程序的反序列化数据,用于获取用户详细信息,因此您可以从中提取所需的任何内容,或者在此处插入您自己的值。social auth将接受您在“用户名”中粘贴的任何内容,并将其用作新帐户的用户名。 如果您想要更多的控制,您也可以尝试覆盖后端的“username”方法

重写后端时,不要忘记将其添加到settings.py中的AUTHENTICATION\u BACKENDS。此外,我不确定这到底是如何工作的,但我认为您需要在自定义后端的文件中添加类似的内容,以便让social auth正确链接您的后端:

BACKENDS = {
    'facebook': CustomFacebookAuth,
}