在 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 时如何自定义用户配置文件

从 django-allauth 中删除“用户名”字段

如何让所有 django allauth 表单和对话框显示在弹出窗口中

django-allauth:如何修改电子邮件确认 url?

Django allauth有时没有从Facebook回来的电子邮件