Django服务端代码存放位置及django-allauth获取用户头像相关问题
Django 中可放置谷歌头像获取代码的服务端位置说明
你提到的user.socialaccount_set.filter(provider='google')[0].extra_data['picture']代码,可以放在Django服务端所有能获取到登录用户对象的后端代码位置,常见可放置的位置如下:
视图文件(views.py)
这是最常用的放置位置,你可以在视图函数或者类视图中获取头像地址,随其他上下文参数传递给前端模板渲染。示例用法:# 函数视图示例 def user_profile(request): avatar_url = "/static/default-avatar.png" if request.user.is_authenticated: google_account = request.user.socialaccount_set.filter(provider='google').first() if google_account: avatar_url = google_account.extra_data['picture'] return render(request, "profile.html", {"avatar_url": avatar_url})如果是类视图,可以在
get_context_data方法中添加该逻辑。自定义上下文处理器
如果你需要在全站所有模板中都能直接调用头像地址,不需要每个视图单独传参,可以自定义上下文处理器,把头像地址注入到所有模板的上下文中。用户模型的自定义方法
你可以给Django内置User模型或者你自定义的扩展用户模型添加专属方法,封装头像获取逻辑,后续在视图、模板中可以直接调用该方法即可获取头像,避免重复写查询逻辑。示例:# 扩展用户模型中添加方法 class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) # 其他字段省略 def get_google_avatar(self): google_account = self.user.socialaccount_set.filter(provider='google').first() return google_account.extra_data['picture'] if google_account else "/static/default-avatar.png"信号处理函数
如果你希望用户首次通过谷歌账号登录时就把头像地址持久化存储到你自己的用户表字段中,减少后续重复查询socialaccount表的性能消耗,可以在allauth提供的登录成功信号回调中执行这段代码,将头像地址存入自定义字段,后续直接读取自有字段即可。
注意:使用这段代码时必须做异常兼容处理,避免用户未绑定谷歌账号时,空列表取下标报错,建议使用
first()方法判断是否存在对应第三方账号,再读取头像地址。
内容的提问来源于stack exchange,提问作者Prateek p
相关产品推荐
相关产品推荐

