我正在使用Django Social Auth(v.7.7.22)通过Facebook注册用户,这样做很好。
我怀疑如何为新用户收集额外数据:
**kwargs
)?我的管道如下:
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
中,而不是使用会话,是否可以?我什么时候应该使用session。其他自定义函数基于Matias Aguirre example,并使用会话 用于存储新用户的用户名。
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}
所以,我不确定何时使用会话或“正确的习惯用法”来解决我的问题。 提前谢谢。
答案 0 :(得分:4)
Matias Aguirre(django socialauth creator)在DSA google mail list
中轻轻回答了我的问题他的回答:
如您所见,收集数据很简单,但放在哪里取决于 您的项目,您计划如何处理数据以及您期望的位置 它可用。例如,如果您打算放置头像图像 在用户配置文件模型上,您应该获取该配置文件 当前用户并将其存储在那里,如果您使用自定义用户 avatar_url字段,然后您应该在用户之后填写该字段 创建,如果您打算下载图像并将其存储在本地 服务器使用用户名(id等)作为文件名,然后就可以了 那样的。
会话通常用作与a通信的机制 视图。
关于“用户是新的”,有一个标志“is_new”设置为True / False 当用户是新用户还是新用户时,它直到用户才更新 调用“create_user”。
管道条目“save_status_to_session”应放在之前 在你的情况下,破坏管道流程的方法 handle_new_user。
谢谢大家。
答案 1 :(得分:0)
在尝试使用Tumblr和Instagram获取额外数据时,我遇到了类似的问题,直到找到this article。
创建/关联用户时,似乎有两种方法可以使用热门extra_data
:
这是许多数据的最简单方法,但根据具体情况可能无法访问。在OAuth page in the docs上有一个简短的提及。
例如,在您的设置文件中:
FACEBOOK_EXTRA_DATA = [('<actual field from FB>', '<your alias>')]
但是,各种后端似乎没有返回一致的值,因此我必须调试social_auth.backends.pipeline.social.load_extra_data
才能找到可访问的字段。有时,单个后端会描述哪些字段可用(例如see Facebook Backend)或API文档,但最可靠的方法是逐步执行其代码。
正如您已经开始的那样,您可以定义自定义函数并将其挂钩到管道中。从链接的文章(并稍加修改):
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()
在任何一种情况下,一旦你完成了,额外的数据就可以通过social_user.extra_data['your_field']
获得。希望有所帮助。
根据我的理解,除非您使用django-socialauth
进行帐户登录,否则管道仅在初始关联上运行,因此用户在该点始终是新的。除此之外,我不是百分百肯定。