【问题标题】:KeyError at /api/social/convert-token/api/social/convert-token 处的 KeyError
【发布时间】:2017-01-30 23:30:42
【问题描述】:

我正在开发一款应用,让客户和司机可以通过 Facebook 登录。在使用邮递员进行测试时,我能够创建访问令牌。但是,当我创建一个访问令牌来区分用户是客户还是司机时,我在邮递员中收到了这个错误。 “/api/social/convert-token 处的 KeyError 'user_type'"

我已经传递了所有必要的参数(即 client_id、client_secret、user_type、grant_type、backend 和 FB 令牌),所以这不是参数问题。

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

为什么我会收到错误消息?

【问题讨论】:

  • request.POST.get('user_type')?
  • 感谢@KlausD 的快速回复。我试过了,得到了错误“'dict'对象没有属性'POST'。”我发现当我在 if/elif 语句上方添加 "request['user_type'] = ['driver', 'customer']" 时,我摆脱了 user_type 错误,但唯一的问题是,如果我将参数作为驱动程序传递或客户,无论如何它只会作为客户保存在 Django 中
  • 这个问题你解决了吗?

标签: python django-socialauth


【解决方案1】:

编辑 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2021-10-02
    • 1970-01-01
    • 2013-03-28
    相关资源
    最近更新 更多