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
相关产品推荐
相关产品推荐

