/ api / social / convert-token处的KeyError

时间:2017-01-30 23:30:43

标签: python django-socialauth

我正在构建一个应用程序,让客户和司机通过Facebook登录。在使用邮递员进行测试时,我能够创建访问令牌。但是,当我开始创建一个区分用户是客户还是驱动程序的访问令牌时,我在邮递员中收到此错误。 “/ api / social / convert-token中的KeyError 'USER_TYPE'“

我已经通过了所有必要的参数(即client_id,client_secret,user_type,grant_type,backend和FB token),因此它不是一个参数问题。

我的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()

为什么我收到错误?

1 个答案:

答案 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)