Я использую Django Social Auth (v0.7.22) для регистрации пользователей через Facebook, и это работает нормально.Сбор дополнительных пользовательских данных в конвейере Django Social Auth
Моих сомнений в том, как собрать дополнительные данные для новых пользователей:
- Как определить новый пользователь?
- Где хранить собранные данные (в сеансе 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()
Мои сомнения:
- Я проверяю, если
user
-None
для обнаружения новых пользователей (не уверен, что i t's ОК, чтобы предположить, что). - Я храню метаданные аватара в конвейере
**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}
Итак, я не уверен, когда использовать сеансы или «правильную идиому» для решения моей проблемы. Спасибо заранее.
Вы можете определить, является ли пользователь новым, установив флаг 'is_new', переданный в записи трубопровода. – omab