2017-01-30 1 views
0

Je construis une application qui permet aux clients et aux conducteurs de se connecter via Facebook. En testant avec un facteur, j'ai pu créer des jetons d'accès. Cependant, quand je suis ensuite allé créer un jeton d'accès qui différencie si un utilisateur est un client ou un pilote, j'obtiens cette erreur dans le facteur. "KeyError à/api/sociale/convert-jeton 'user_type'"KeyError at/api/social/convert-token

J'ai passé toutes les params nécessaires (c.-à-client_id, client_secret, user_type, grant_type, back-end, et le jeton FB), il est donc pas problème de param.

Mon settings.py est:

SOCIAL_AUTH_PIPELINE = (
    'social_core.pipeline.social_auth.social_details', 
    'social_core.pipeline.social_auth.social_uid', 
    'social_core.pipeline.social_auth.auth_allowed', 
    'social_core.pipeline.social_auth.social_user', 
    'social_core.pipeline.user.get_username', 
    'social_core.pipeline.user.create_user', 
    'foodtaskerapp.social_auth_pipeline.create_user_by_type', # <--- set the path to the function 
    'social_core.pipeline.social_auth.associate_user', 
    'social_core.pipeline.social_auth.load_extra_data', 
    'social_core.pipeline.user.user_details', 
) 

et mon social_auth_pipeline.py ressemble à ceci

from foodtaskerapp.models import Customer, Driver 

def create_user_by_type(backend, user, request, response, *args, **kwargs): 
    if backend.name == 'facebook': 
     avatar = 'https://graph.facebook.com/%s/picture?type=large' % response['id'] 

    if request['user_type'] == "driver" and not Driver.objects.filter(user_id=user.id): 
     Driver.objects.create(user_id=user.id, avatar = avatar) 
    elif not Customer.objects.filter(user_id=user.id): 
     Customer.objects.create(user_id=user.id, avatar = avatar) 

Les deux modèles ont été mis en place aussi bien dans models.py.

class Customer(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='customer') 
    avatar = models.CharField(max_length=500) 
    phone = models.CharField(max_length=500, blank=True) 
    address = models.CharField(max_length=500, blank=True) 

    def __str__(self): 
     return self.user.get_full_name() 

class Driver(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='driver') 
    avatar = models.CharField(max_length=500) 
    phone = models.CharField(max_length=500, blank=True) 
    address = models.CharField(max_length=500, blank=True) 

    def __str__(self): 
     return self.user.get_full_name() 

Pourquoi ai-je l'erreur?

+0

'request.POST.get ('user_type')'? –

+0

Merci pour la réponse rapide @KlausD. J'ai essayé et j'ai eu l'erreur "l'objet 'dict' n'a aucun attribut" POST "." J'ai trouvé quand j'ai ajouté "request ['user_type'] = ['driver', 'client']" au dessus de l'instruction if/elif je me suis débarrassé de l'erreur user_type, mais le seul problème était que si je passais le param comme driver ou client, il enregistre uniquement dans Django en tant que client, peu importe ce que – SMUstang21

+0

Avez-vous résolu ce problème? –

Répondre

0

Modifier create_user_by_type() méthode pour résoudre ce problème:

def create_user_by_type(backend, user, response, *args, **kwargs): 
request = backend.strategy.request_data() 
if backend.name == 'facebook': 
    avatar = 'https://graph.facebook.com/%s/picture?type=large' % response['id'] 

if request["user_type"] == "driver" and not Driver.objects.filter(user_id=user.id): 
    Driver.objects.create(user_id=user.id, avatar = avatar) 
elif not Customer.objects.filter(user_id=user.id): 
    Customer.objects.create(user_id=user.id, avatar = avatar)