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

时间:2013-04-11 13:53:40

标签: django django-socialauth

我正在使用Django Social Auth(v.7.7.22)通过Facebook注册用户,这样做很好。

我怀疑如何为新用户收集额外数据:

  1. 如何检测新用户?
  2. 存储收集的数据的位置(在Django会话中或通过管道传递**kwargs)?
  3. 我的管道如下:

    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()
    

    我的怀疑:

    1. 我正在检查user是否None用于检测新用户(不确定是否可以假设)。
    2. 我将头像元数据存储在管道**kwargs中,而不是使用会话,是否可以?我什么时候应该使用session。
    3. 其他自定义函数基于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} 
      

      所以,我不确定何时使用会话或“正确的习惯用法”来解决我的问题。 提前谢谢。

2 个答案:

答案 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

* _ 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进行帐户登录,否则管道仅在初始关联上运行,因此用户在该点始终是新的。除此之外,我不是百分百肯定。