Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django Social Auth管道中收集额外的用户数据_Django_Django Socialauth - Fatal编程技术网

在Django Social Auth管道中收集额外的用户数据

在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

我正在使用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_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()