使用Python Social Auth Django无法保存Facebook登录性别数据
我来帮你搞定这个Facebook性别字段存为空的问题,这在Python Social Auth + Django的场景里挺常见的,主要是几个环节没配置到位,咱们一步步来排查解决:
1. 先确认Facebook应用拿到了性别权限
Facebook现在默认不会给第三方应用返回用户性别数据,你得先去Facebook开发者后台操作:
- 找到你的应用,进入「权限与功能」页面
- 添加
user_gender这个权限 - 如果是公开上线的应用,还需要提交权限审核;测试阶段用测试用户的话,一般可以直接使用,不用等审核
要是没申请这个权限,Facebook API根本不会返回gender字段,自然存空啦。
在你的Django项目settings.py里,得明确告诉Social Auth要请求Facebook的gender字段:
# Facebook登录的权限范围,加上gender SOCIAL_AUTH_FACEBOOK_SCOPE = ['email', 'gender'] # 指定要从Facebook获取的字段,必须显式包含gender SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = { 'fields': 'id, name, email, gender' }
默认情况下,Social Auth不会请求gender字段,所以必须通过fields参数明确指定,不然Facebook不会返回这个数据。
3. 用Pipeline处理性别数据的保存
你现在的post_save信号只是创建了空的Profile,但不会填充从Facebook拿到的gender数据。得在Python Social Auth的pipeline里加一个自定义步骤,来处理这个逻辑:
首先在settings.py里修改SOCIAL_AUTH_PIPELINE,添加你的自定义处理函数:
SOCIAL_AUTH_PIPELINE = ( # 保留默认的pipeline步骤,别删 'social_core.pipeline.social_auth.social_details', 'social_core.pipeline.social_auth.social_uid', 'social_core.pipeline.social_auth.auth_allowed', 'social_core.pipeline.social_auth.social_user', 'social_core.pipeline.user.get_username', 'social_core.pipeline.user.create_user', # 这里添加你的自定义保存步骤,替换成你的app名称 'your_app_name.pipeline.save_user_profile', 'social_core.pipeline.social_auth.associate_user', 'social_core.pipeline.social_auth.load_extra_data', 'social_core.pipeline.user.user_details', )
然后在你的app目录下创建pipeline.py文件,写入以下函数:
def save_user_profile(backend, user, response, *args, **kwargs): # 只处理Facebook登录的情况 if backend.name == 'facebook': # 从Facebook返回的响应里取出gender gender = response.get('gender') # 获取用户的Profile(因为post_save已经创建了,这里用get就行) profile = user.profile if gender: profile.gender = gender profile.save()
这个函数会在用户通过Facebook登录成功后,自动把拿到的gender值保存到对应的Profile里。
4. 测试注意事项
- 测试的时候最好用新的Facebook账号登录,因为已经创建过的用户Profile可能还是空值,你可以手动去后台更新或者删除旧用户重新测试
- 可以先在pipeline函数里加个print或者日志,看看
response里有没有gender字段,确认数据有没有传过来
这样操作下来,应该就能正常把Facebook用户的性别保存到数据库里啦。
内容的提问来源于stack exchange,提问作者R.J. Jackson
相关产品推荐
相关产品推荐

