Django. Python social auth. create profiles at the end of pipeline

梦想与她 提交于 2019-12-21 18:03:43

问题


I want to add a function at the end of the auth pipeline, the function is meant to check if there is a "Profiles" table for that user, if there isn't it will create a table. The Profiles model is a table where I store some extra information about the user:

class Profiles(models.Model):
    user = models.OneToOneField(User, unique=True, null=True)
    description = models.CharField(max_length=250, blank=True, null=True)
    points = models.SmallIntegerField(default=0)
    posts_number = models.SmallIntegerField(default=0)

Each user must have a Profiles table. So, I added a function at the end of the pipeline:

SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.social_details',
    'social.pipeline.social_auth.social_uid',
    'social.pipeline.social_auth.auth_allowed',
    'social.pipeline.social_auth.social_user',
    'social.pipeline.user.get_username',
    'social.pipeline.user.create_user',
    'social.pipeline.social_auth.associate_user',
    'social.pipeline.social_auth.load_extra_data',
    'social.pipeline.user.user_details',
    'app.utils.create_profile'  #Custom pipeline
)

#utils.py 
def create_profile(strategy, details, response, user, *args, **kwargs):
    username = kwargs['details']['username']
    user_object = User.objects.get(username=username)
    if Profiles.ojects.filter(user=user_object).exists():
        pass
    else:
        new_profile = Profiles(user=user_object)
        new_profile.save()
    return kwargs

I get the error:

 KeyError at /complete/facebook/
 'details'
 ...
 utils.py in create_profile
 username = kwargs['details']['username']

I'm new to python social auth, and it looks that I'm missing something obvious. Any help will be appreciated.


回答1:


Ok so I'll answer my own question just in case it is useful for someone in the future. I'm no expert but here it is:

I was following this tutorial, and becouse he does

 email = kwargs['details']['email']

I thought I could do

username = kwargs['details']['username']

But it didn't work, it gave my a KeyError.

Then I tried:

username = details['username']

And it worked. But I had a new problem, the username from the details dict was something like u'Firstname Lastname' and when I tried to get the User object

user_object = User.objects.get(username=username)

It was not found, becouse the username in the User model was u'FirstnameLastname' (without the space).

Finally I read the docs again and I found out that I could simply use the user object directly, it gets passed to the function as "user":

def create_profile(strategy, details, response, user, *args, **kwargs):

    if Profiles.objects.filter(usuario=user).exists():
        pass
    else:
        new_profile = Profiles(user=user)
        new_profile.save()

    return kwargs


来源:https://stackoverflow.com/questions/25000074/django-python-social-auth-create-profiles-at-the-end-of-pipeline

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!