如何使用 django-allauth 访问用户名和配置文件

Posted

技术标签:

【中文标题】如何使用 django-allauth 访问用户名和配置文件【英文标题】:How to access user names and profiles with django-allauth 【发布时间】:2012-01-18 15:16:51 【问题描述】:

我正在使用 Django 和 django-allauth 进行社交身份验证。

我已启动并运行身份验证,但谁能给出简单的示例说明如何:

显示登录用户的姓名和头像 向用户帐户添加一些信息?

例如,在主页上,我有

% if user.is_authenticated %
<li><a href="% url account_logout %?next=/">Logout</a></li>
% endif %

这样可以正确显示注销链接,但我该如何添加用户名和头像?

类似(伪代码):

<p>You're logged in with  user.account_provider?  as  user .</p>
<img src=" user.avatar_url " />

然后,如果我想在用户的个人资料中添加额外的属性,我该怎么办?我应该使用其他一些与 Django 用户相关的应用程序吗?

感谢您的帮助。

【问题讨论】:

答案是否提供了帮助?我和你有同样的问题,想知道答案吗? 请查看我的回答:***.com/questions/12222021/… 它显示了获取头像 URL 等的正确方法。 【参考方案1】:

所以我昨天也有库存,我已经在互联网上四处寻找解决方案,但没有一个看起来像我想出的那样可以理解...... 安装和配置 allauth 包后,我做了以下操作:

    在app目录下创建signal.py文件

    在你的 venv 中找到 allauth 包

    然后导航到 allauth/socialaccount/models.py

    这样你可以更好地理解如何从allauth包中抓取模型或调用其他函数和类

    在 app/signal.py 中这样做:

     from django.db.models.signals import post_save;p0-
     from django.dispatch import receiver
     from .models import Profile
     from allauth.socialaccount.models import SocialAccount# step 3 made this possible
     from django.contrib.auth.models import User
    
     @receiver(post_save, sender = SocialAccount)
     def create_profile(sender, instance, created, **kwargs):
        if created:
           # Grabbing data from social account to create profile for that user
           profile=Profile(
                  user=instance.user,
                  photo=instance.extra_data['picture']
                          )
           profile.save()
         else:
        # Do something else
    

你看到信号的发送者是模型“SocialAccount”,因为这个模型总是在认证过程中创建,然后抓取字段“extra_data”,它是一个字典,然后是key“['picture']” “extra_data”字段中的 JSON 对象......我希望这对你有用。谢谢

这样您就可以获取图片的值并为用户分配个人资料

【讨论】:

【参考方案2】:

您可以在用户类的外键中的一组社交帐户中进行 for 循环,在模板中如下所示:

% for account in user.socialaccount_set.all %

 % comment % show avatar from url % endcomment %
 <h2 style="text-transform:capitalize;"> account.provider  account data</h2>

 <p><img   src=" account.get_avatar_url "/></p>

 <p>UID: <a href=" account.extra_data.link "> account.uid </a></p>

 <p>Username:  account.extra_data.username </p>

  <p>First Name:  account.extra_data.first_name </p>

  <p>Last Name:  account.extra_data.last_name </p>

  <p>Dashboard Link: 
  <a href=" account.extra_data.link "> account.extra_data.link </a></p>
  % empty %
  <p>you haven't any social account please</p>
% endfor %

【讨论】:

【参考方案3】:

SocialAccount 模型实例可供使用社交帐户注册的用户使用。

在你的模板中,你可以简单地写:

头像网址: user.socialaccount_set.all.0.get_avatar_url UID: user.socialaccount_set.all.0.uid 加入日期: user.socialaccount_set.all.0.date_joined上次登录: user.socialaccount_set.all.0.last_login

对于全名: user.socialaccount_set.all.0.extra_data.name

欲了解更多信息:Django allauth source

【讨论】:

这是现代 Django (1.11.x) 和 allauth (0.32.x) 的正确答案。【参考方案4】:

如果你查看 django-allauth 源码https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/models.py#L7

这是一个抽象模型,代表所有其他特定服务模型具有的所有方法。这样你就可以写

<p>You're logged in with  user.get_provider  as  user .</p>
<img src=" user.get_avatar_url " />

【讨论】:

这些 get_provider() 和 get_avatar_url() 方法似乎没有通过最近的 django 和 django-allauth 传播到用户对象上。似乎这需要手动填充上下文。 SocialAccount 类仍然有这些方法。您确定上下文中有 SocialAccount 实例吗? 我激活了 allauth.socialaccount.context_processors.socialaccount 上下文处理器,它在上下文中放置了一个“socialaccount”字典;此 dict 中的条目是活动提供者。不过,我看不到这个(或 SocialAccount 模型)如何修改用户对象,允许像“user.get_provider”这样的访问。也许我完全错过了你的观点?抱歉,我对 allauth、django 和 python 比较陌生,所以我可能遗漏了一些明显的东西。

以上是关于如何使用 django-allauth 访问用户名和配置文件的主要内容,如果未能解决你的问题,请参考以下文章

django-allauth:将多个社交帐户链接到单个用户

使用 django-allauth 时如何自定义用户配置文件

使用来自 django-allauth 的访问令牌登录 Spotify iOS SDK

django-allauth 中多个设备的访问令牌授权

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

如何在 django-allauth 上自定义 activate_url?