【发布时间】:2019-02-03 03:02:47
【问题描述】:
我目前正在为一个 uni 项目构建 API。我遇到了以自定义方式生成身份验证令牌的问题。让我解释一下:我应该在端点中收到一个 POST 请求,内容如下:
{
"university_id": 1,
"coords":{
"latitude": 0.0,
"longitude": 0.0
}
}
想法是,给定university_id 和coords,后端对其进行验证(检查坐标是否在有效区域内),然后返回一个令牌,如下所示:
{
"token": asdfsagag23214,
}
如您所见,没有涉及登录凭据(也没有客户端应用程序的用户模型),所以我猜我需要创建一个自定义令牌。我查阅了 Django REST Framework 文档,并为我的令牌模型提出了类似的内容:
class AuthToken(models.Model):
key = models.CharField(verbose_name='Key', max_length=40, primary_key=True)
created = models.DateTimeField(
verbose_name='Creation date', auto_now_add=True)
class Meta:
verbose_name = 'Token'
verbose_name_plural = 'Tokens'
def save(self, *args, **kwargs):
if not self.key:
self.key = self.generate_key()
return super().save(*args, **kwargs)
def generate_key(self):
return binascii.hexlify(os.urandom(20)).decode()
def __str__(self):
return self.key
然后是序列化器:
class AuthTokenSerializer(serializers.Serializer):
class Meta:
model = AuthToken
fields = ('key', 'created', )
def to_internal_value(self, data):
university = data.get('university')
coords = data.get('coords')
if not university:
raise serializers.ValidationError({
'university': 'This field is required.'
})
if not coords:
raise serializers.ValidationError({
'coords': 'This field is required.'
})
# coordinate validation goes here
return {
'university': int(university),
'coords': coords
}
def create(self, validated_data):
return AuthToken.objects.create(**validated_data)
最后,views.py:
@api_view(['POST'])
def generate_token(request):
if request.method == 'POST':
serializer = AuthTokenSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
我不确定我错过了什么,但我无法完全理解我需要做些什么才能使其正常工作。现在我正在使用 swagger 对其进行测试,它无法以任何方式工作,形状或形式,没有参数可输入,甚至通过终端使用 cURL 似乎也没有给我预期的结果。
为了记录,我使用的是Django 2.1 和Django Rest framework 3.8.2。
我将不胜感激任何帮助,以及有关此代码的任何进一步的 cmets(毕竟我仍在学习)。我猜我缺少方法,但不确定在哪里。
【问题讨论】:
标签: django django-rest-framework token python-3.6