2013-04-11 2 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. Я проверяю, если user - None для обнаружения новых пользователей (не уверен, что i t's ОК, чтобы предположить, что).
  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

Matias Aguirre (Джанго socialauth создатель) осторожно ответил на мой вопрос в DSA google mail list

Его ответ:

Сбор данных легко, как вы видели, но куда девать это зависит от вашего проекта , то, что вы планируете делать с данными, и где вы ожидаете, что он будет доступен . Например, если вы планируете поместить изображение аватара в модель профиля пользователя, то вы должны получить профиль для текущего пользователя и сохранить его там, если вы используете пользовательский пользователь с полем avatar_url, то вы должны заполнить это поле после того, как пользователь создал , если вы планируете загрузить изображение и сохранить его локально на сервере , используя имя пользователя (id и т. д.) в качестве имени файла, а затем просто сделайте это .

Сессия обычно используется как механизм связи с видом .

Что касается «пользователь новый», есть флаг «is_new» установлено значение True/False , когда пользователь является новым или нет, но это не обновляется до тех пор, «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

Смежные вопросы