我正在使用 Django Social Auth (v0.7.22) 通过 Facebook 注册用户,并且工作正常。
我的疑问是如何为新用户收集额外的数据:
- 如何检测新用户?
- 将收集到的数据存储在哪里(在 Django 会话中或通过管道传递**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而不是使用会话中,可以吗?我什么时候应该使用会话。
其他自定义函数基于Matias Aguirre 示例,并使用会话存储新用户的用户名。
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} 
所以,我不确定何时使用会话或“正确的成语”来解决我的问题。提前致谢。