在Django Social Auth管道中收集额外的用户数据
我正在使用Django Social Auth(v0.7.22)通过Facebook注册用户,这一切正常 我的疑问是如何为新用户收集额外数据:在Django Social Auth管道中收集额外的用户数据,django,django-socialauth,Django,Django Socialauth,我正在使用Django Social Auth(v0.7.22)通过Facebook注册用户,这一切正常 我的疑问是如何为新用户收集额外数据: 如何检测新用户 在何处存储收集的数据(在Django会话中或通过管道传递) 我的管道看起来像: SOCIAL_AUTH_PIPELINE = ( 'social_auth.backends.pipeline.social.social_auth_user', 'social_auth.backends.pipeline.misc.save
SOCIAL_AUTH_PIPELINE = (
'social_auth.backends.pipeline.social.social_auth_user',
'social_auth.backends.pipeline.misc.save_status_to_session',
## My customs ...
'myapp.pipeline.load_data_new_user',
'myapp.pipeline.handle_new_user',
'myapp.pipeline.username',
##
'social_auth.backends.pipeline.user.create_user',
'social_auth.backends.pipeline.social.associate_user',
'social_auth.backends.pipeline.social.load_extra_data',
'social_auth.backends.pipeline.user.update_user_details',
)
第一个自定义功能仅收集Facebook个人资料图片:
def load_data_new_user(backend, response, user, *args, **kwargs):
if user is None:
if backend.name == "facebook":
try:
url = "http://graph.facebook.com/%s/picture?width=200&height=200&redirect=false" % response['id']
data = json.loads(urllib2.urlopen(url).read())['data']
return {'avatar': data}
except StandardError:
return {'avatar': None}
else:
raise ValueError()
我的疑问是:
user
是否为None
,以检测新用户(不确定是否可以这样假设)李>
**kwargs
中,而不是使用会话,可以吗?我应该什么时候使用会话def handle_new_user(request, user, *args, **kwargs):
if user is None and not request.session.get('saved_username'):
return HttpResponseRedirect('/form/')
def username(request, user, *args, **kwargs):
if user is not None:
username = user.username
else:
username = request.session.get('saved_username')
return {'username': username}
因此,我不确定何时使用会话或“正确的习惯用法”来解决我的问题。
提前感谢。我在尝试使用Tumblr和Instagram获取额外数据时遇到了类似的问题,直到我找到了 当创建/关联用户时,似乎有两种方法来获取额外数据: *_额外数据 对于许多数据块来说,这是最简单的方法,但根据具体情况,可能无法访问。报纸上简短地提到了这一点 例如,在设置文件中:
FACEBOOK_EXTRA_DATA = [('<actual field from FB>', '<your alias>')]
在任何一种情况下,一旦您这样做了,就可以通过social\u user.extra\u data['your\u field']
获得额外的数据。希望有帮助
检测用户是否是新用户如何?
根据我的理解,除非您使用django socialauth
进行帐户登录,否则管道仅在初始关联上运行,因此用户在该点上始终是新的。除此之外,我还不是100%确定。Matias Aguirre(django socialauth的创建者)温和地回答了我的问题
他的回答是:
如您所见,收集数据很容易,但放在哪里取决于
您的项目,您计划对数据做什么,以及您期望的位置
它将是可用的。例如,如果您计划放置化身图像
在用户配置文件模型上,您应该获得
如果您使用具有
头像url字段,那么您应该在用户被删除后填充该字段
已创建,如果您计划下载图像并将其本地存储到
服务器使用用户名(id等)作为文件名,然后执行此操作
也是这样
会话通常用作与服务器的通信机制
视图
关于“用户是新的”,有一个标志“是新的”设置为真/假
当用户是否为新用户,但在
调用“创建用户”
管道条目“save_status_to_session”应放在
在您的案例中,中断管道流的方法
处理新用户
谢谢大家 您可以通过检查传递给管道条目的
is_new
标志来检测用户是否是新用户。
def get_user_avatar(backend, details, response, social_user, uid,\
user, *args, **kwargs):
url = None
if getattr(backend, 'name', None) == 'facebook':
url = "http://graph.facebook.com/%s/picture?type=large" % response['id']
if url:
# Save the image somewhere, or just use the URL
avatar = url
social_user.extra_data['avatar'] = avatar
social_user.save()