5

我正在使用 Django Social Auth (v0.7.22) 通过 Facebook 注册用户,并且工作正常。

我的疑问是如何为新用户收集额外的数据:

  1. 如何检测新用户?
  2. 将收集到的数据存储在哪里(在 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()

我的疑惑:

  1. 我正在检查是否user用于None检测新用户(不确定是否可以假设)。
  2. 我将头像元数据存储在管道中**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} 

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

4

2 回答 2

5

Matias Aguirre(django socialauth 创建者)在DSA google 邮件列表中温柔地回答了我的问题

他的回答:

如您所见,收集数据很容易,但将数据放在哪里取决于您的项目、您计划如何处理数据以及您希望它在哪里可用。例如,如果您打算将头像图像放在用户配置文件模型上,那么您应该获取当前用户的配置文件并将其存储在那里,如果您使用带有 avatar_url 字段的自定义用户,那么您应该在之后填写该字段用户已创建,如果您打算下载图像并使用用户名(id 等)作为文件名将其存储到服务器本地,那么也这样做。

会话通常用作与视图进行通信的机制。

关于“用户是新用户”,当用户是否是新用户时,有一个标志“is_new”设置为 True/False,但在调用“create_user”之前它不会更新。

管道条目“save_status_to_session”应放置在中断管道流的方法之前,在您的情况下为 handle_new_user。

感谢大家。

于 2013-04-13T14:05:23.000 回答
0

在找到这篇文章之前,我在尝试使用 Tumblr 和 Instagram 获取额外数据时遇到了类似的问题。

extra_data创建/关联用户时,似乎有两种流行方式:

*_EXTRA_DATA

这是处理许多数据的最简单方法,但根据情况可能无法访问。在 docs的 OAuth 页面上有一个简短的提及。

例如,在您的设置文件中:

FACEBOOK_EXTRA_DATA = [('<actual field from FB>', '<your alias>')]

但是,各种后端似乎没有返回一致的值,所以我必须调试social_auth.backends.pipeline.social.load_extra_data才能找到可以访问的字段。有时,各个后端会描述哪些字段可用(例如,请参阅 Facebook 后端)或 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用于帐户登录,否则管道仅在初始关联上运行,因此该用户将始终是新用户。除此之外,我不是 100% 确定的。

于 2013-04-11T19:25:11.140 回答