I'm using Django Social Auth (v0.7.22) for registering users via Facebook, and that is working OK.
My doubt is how to collect extra data for new users:
**kwargs
)?My pipeline looks like:
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',
)
The first custom function just collect the Facebook profile picture:
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()
My doubts:
user
is None
for detecting new users (not sure if it's OK to assume that). **kwargs
instead of use sessions, is it OK? When should I use session.The other custom functions are based on the Matias Aguirre example, and use sessions for storing the username of new users.
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}
So, I'm not sure when to use sessions or the "correct idiom" for resolve my problem. Thanks in advance.
Matias Aguirre (django socialauth creator) gently answered my question in the DSA google mail list
His answer:
Collecting the data is easy as you saw, but where to put it depends on your project, what you plan to do with the data, and where you expect it to be available. For example, if you plan to put the avatar image on a user profile model, then you should get the profile for the current user and store it there, if you use a custom user with an avatar_url field, then you should fill that field after the user was created, if you plan to download the image and store it local to the server using the username (id, etc) as the filename, then just do it that way too.
The session is usually used as a mechanism of communication with a view.
Regarding the "user is new", there's a flag "is_new" set to True/False when the user is new or not, but it's not updated until the "create_user" is called.
The pipeline entry "save_status_to_session" should be placed before the method that breaks the pipeline flow, in your case handle_new_user.
Thanks everyone.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With