【发布时间】: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 中
-
这个问题你解决了吗?