在 django allauth 中,如何从 OpenId 登录/Google 获取用户名?
Posted
技术标签:
【中文标题】在 django allauth 中,如何从 OpenId 登录/Google 获取用户名?【英文标题】:In django allauth, how do I get the username from an OpenId login / Google? 【发布时间】:2012-11-20 15:03:29 【问题描述】:我确实看到了几个类似的问题,但他们似乎并没有完全回答我遇到的问题。
到目前为止,我只在本地运行manage.py runserver
。
一开始我试着把它放在我的 settings.py 中:
import allauth
ACCOUNT_EMAIL_REQUIRED = True
然后尝试将其扩展到:
import allauth
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_AUTHENTICATION_METHOD = "username_email"
ACCOUNT_USERNAME_REQUIRED = True
SOCIALACCOUNT_AUTO_SIGNUP = True
但是当我尝试使用我的 google 帐户登录时(也就是说,在 openId-googlem 而不是直接的 google 下),我可以看到它收到了我的电子邮件,但它不使用我的电子邮件。在回调函数中,我尝试插入一堆打印语句,当我打印 user.__dict__
时,它看起来像是从返回 url 中提取的:
'_state': <django.db.models.base.ModelState object at 0x101604dd0>,
'date_joined': datetime.datetime(2012, 12, 3, 4, 35, 41, 949526, tzinfo=<UTC>),
'email': u'CORRECT_USERNAME@gmail.com',
'first_name': '',
'id': None,
'is_active': True,
'is_staff': False,
'is_superuser': False,
'last_login': datetime.datetime(2012, 12, 3, 4, 35, 41, 949506, tzinfo=<UTC>),
'last_name': '',
'password': '',
'username': ''
也就是说,它会填充电子邮件字段,但不会填充 username
字段。我认为默认情况下,allauth 会用CORRECT_USERNAME
填充username
,但它看起来是空的。
然后当我打印出帐户时,我在user_id
字段中看不到任何内容。
当我跳转到个人资料页面时,它会将username
列为“用户”,这看起来像是绝对的后备/默认设置。也就是这个:
% user_display user %
<p>Another try... <br />
user.username
<p>---------------------------</p>
user.account_provider
<p>---------------------------</p>
user.get_provider
<p>---------------------------</p>
给我这个:
user
Another try...
user
---------------------------
---------------------------
---------------------------
我在 runserver 控制台中没有看到任何错误。
还有什么我需要添加到 settings.py 的吗? 我需要编写一些回调函数来从电子邮件字段中提取用户名吗?
如果这有什么不同的话,我正在使用 python 2.6.1(Snow Leopard)。
提前致谢!
【问题讨论】:
您使用的是哪个版本的 django-allauth?另外,自从您在 12 月 12 日提出问题以来,似乎已经发布了至少 12 个版本的 django-allauth,您所描述的问题可能已经解决... 您找到解决方案了吗? 【参考方案1】:如果你看一下 django-allauth 的 OpenID 代码,你会发现它没有提取用户名,而只提取了电子邮件、名字、姓氏和姓名:
https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/providers/openid/provider.py#L65
至于 ACCOUNT_USERNAME_REQUIRED 设置,您可以在文档中看到它在注册表单中使用:
ACCOUNT_USERNAME_REQUIRED (=True) The user is required to enter a username when signing up. Note that the user will be asked to do so even if ACCOUNT_AUTHENTICATION_METHOD is set to email. Set to False when you do not wish to prompt the user to enter a username.
我希望这可以帮助您解决您的疑问。
【讨论】:
以上是关于在 django allauth 中,如何从 OpenId 登录/Google 获取用户名?的主要内容,如果未能解决你的问题,请参考以下文章
使用 django-allauth 时如何自定义用户配置文件
如何让所有 django allauth 表单和对话框显示在弹出窗口中