You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django集成Google登录时自动拉取用户头像保存至User模型

Django Google第三方登录自动拉取头像实现方案

1. SCOPE配置校验

你当前settings.py里配置的profile、email两个SCOPE已经满足获取头像的权限要求,不需要额外新增配置——你在后台社交账号额外数据中能看到picture字段,就说明Google已经正常返回头像地址了,对应字段位置如下:
后台额外数据字段截图

2. 核心逻辑实现

你已经配置了自定义的SocialAccountAdapter,直接重写适配器的populate_user方法即可,这个方法是django-allauth预留的用户字段填充钩子,会在第三方登录拉取到用户数据后执行。
首先确保你已经安装requests库用来下载头像资源,未安装的话执行命令:
pip install requests

然后打开你配置的MyApp/adapter.py文件,写入以下代码:

import requests
from django.core.files.base import ContentFile
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter


class MySocialAccountAdapter(DefaultSocialAccountAdapter):
    def populate_user(self, request, sociallogin, data):
        # 执行父类默认逻辑,完成邮箱、姓名等基础字段填充
        user = super().populate_user(request, sociallogin, data)

        # 仅在用户首次通过Google注册时拉取头像,避免后续覆盖用户自行上传的头像
        if not user.pk and sociallogin.account.provider == "google":
            extra_data = sociallogin.account.extra_data
            avatar_url = extra_data.get("picture")
            
            if avatar_url:
                try:
                    # 请求头像资源,设置超时避免阻塞登录流程
                    resp = requests.get(avatar_url, timeout=5)
                    if resp.status_code == 200:
                        # 生成唯一文件名,防止重名覆盖
                        file_suffix = f"{sociallogin.account.uid}.jpg"
                        avatar_name = f"google_avatar_{file_suffix}"
                        # 将头像内容存入自定义User模型的profile_pic字段
                        user.profile_pic.save(
                            avatar_name,
                            ContentFile(resp.content),
                            save=False
                        )
                except Exception:
                    # 头像拉取失败时直接使用默认头像,不打断正常登录流程
                    pass

        return user

3. 注意事项

  • 代码中save=False参数是为了避免重复执行数据库写入操作,allauth后续会统一完成用户实例的保存
  • 如果需要每次用户通过Google登录都同步最新头像,去掉not user.pk的判断即可
  • 如果需要更高清的头像,可以在拿到的avatar_url后拼接尺寸参数,比如将URL末尾默认的=s96-c替换为=s400即可获取400px尺寸的头像
  • 图片会自动保存到你模型里配置的profile_pics/users目录下,不需要额外处理路径逻辑

内容的提问来源于stack exchange,提问作者Kushagra Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:09:19