2013-04-11 38 views
4

我使用Django Social Auth(v0.7.22)通過Facebook註冊用戶,並且工作正常。在Django Social Auth管道中收集額外的用戶數據

我的疑問是如何收集額外數據爲新用戶:

  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. 我檢查,如果userNone用於檢測新用戶(不確定是否我可以假設)。
  2. 我將頭像元數據存儲在管道的**kwargs而不是使用會話,它可以嗎?我應該什麼時候使用會話。

其他自定義功能基於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} 

所以,我不確定何時使用會話或「正確的成語」來解決我的問題。 在此先感謝。

回答

4

馬蒂亞斯·阿吉雷(Django的socialauth創建者)輕輕地回答我的問題在DSA google mail list

他的回答是:

收集如你看到的數據是很容易的,但把它放在哪裏取決於 項目,您打算如何處理這些數據,以及您期望可以使用哪些地方 。例如,如果您打算將頭像圖片 放在用戶個人資料模型上,那麼您應該獲取當前用戶的個人資料並將其存儲在那裏,如果您使用的是具有 avatar_url字段的自定義用戶,則應填寫如果你打算下載鏡像並將其存儲在本地的 服務器上,那麼用戶名爲 的用戶名是 。

該會話通常用作與 視圖進行通信的機制。

關於「用戶是新」,有一個標誌「is_new」設置爲真/假 當用戶新的或不是,但它不更新,直到 「create_user」之稱。

管道進入「save_status_to_session」應 之前放置,打破了管道流的方法,你的情況 handle_new_user。

謝謝大家。

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進行帳戶登錄,否則管道僅在初始關聯上運行,因此用戶在此時始終是新的。除此之外,我不是100%確定的。

+2

您可以通過檢查傳遞給流水線條目的'is_new'標誌來檢測用戶是否是新的。 – omab 2013-04-12 17:26:20

相關問題