2017-01-30 14 views
0

Я создаю приложение, которое позволяет клиентам и водителям подписываться через Facebook. Во время тестирования с использованием почтового менеджера мне удалось создать токены доступа. Однако, когда я тогда пошел создавать маркер доступа, который отличает, является ли пользователь клиентом или драйвером, я получаю эту ошибку в почтальоне. "KeyError в/API/социальной/Convert-маркер 'user_type'"KeyError at/api/social/convert-token

Я прошел все необходимые Params (т.е. client_id, client_secret, user_type, grant_type, бэкенд и FB лексема), так что это не является param проблема.

Мой settings.py является:

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', 
) 

и мой social_auth_pipeline.py выглядит следующим образом

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) 

Обе модели были созданы, а также в 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() 

Почему я получаю сообщение об ошибке?

+0

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

+0

Спасибо за быстрый ответ @KlausD. Я попробовал это и получил ошибку. Объект «dict» не имеет атрибута «POST». Я обнаружил, что когда я добавил «request ['user_type'] = ['driver', 'customer']" выше оператора if/elif, я избавился от ошибки user_type, но единственная проблема заключалась в том, что если бы я передал параметр как драйвер или клиент, он сохраняет только в Django в качестве клиента независимо от того, что – SMUstang21

+0

Вы решили эту проблему? –

ответ

0

Редактировать create_user_by_type() способ решить эту проблему:

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)