Django和REST API用于提供基于计算的请求

时间:2015-01-05 19:18:18

标签: python django django-rest-framework tastypie

我在Django中编写了一个机器学习应用程序,因此用户可以在表单中指定一些参数并训练模型。模型训练完成后,我想提供以下请求:

curl http://localhost:8000/.../?model_input='XYZ' 

我希望Django在给定输入XYZ的情况下返回模型的输出。我从Tastypie或REST框架中看到的每个示例都是从查询集构建其响应。如果响应不是查询集的结果而是内存中纯计算的结果,我该如何继续?在我的例子中,响应是由向量(输入)进行矩阵乘法(训练模型)的结果,并且该结果不存储在表中。

管理此类请求的推荐方法是什么? 任何帮助是极大的赞赏。 问候, 帕特里克

1 个答案:

答案 0 :(得分:6)

Django REST Framework不需要模型源或查询集,但在使用其中任何一个时它确实表现最佳。 It does provide a basic Serializer因此as well as basic APIView classes允许在标准的基于Django类的视图之上使用内容协商。

除非您希望序列化结果对象,否则您很可能不需要使用SerializerSerializer的另一个常见用途是验证传入数据并将其转换为预期格式。

如果您只想返回一个基本值(您没有指定“矩阵乘法的结果”实际可能是什么),那么即使只使用基本视图也是手动完成所有操作的一步。 Django REST Framework提供的Response对象允许您返回任意数据,并将其自动转换为可比较的JSON或XML表示形式。您永远不需要调用json.dumps或将数据强制转换为特定的表示形式,Response对象可以为您完成所有操作。

from rest_framework.response import Response
from rest_framework import serializers, views

class IncredibleInputSerializer(serializers.Serializer):
    model_input = serializers.CharField()

class IncredibleView(views.APIView):

    def get(self, request):
        # Validate the incoming input (provided through query parameters)
        serializer = IncredibleInputSerializer(data=request.query_params)
        serializer.is_valid(raise_exception=True)

        # Get the model input
        data = serializer.validated_data
        model_input = data["model_input"]

        # Perform the complex calculations
        complex_result = model_input + "xyz"

        # Return it in your custom format
        return Response({
            "complex_result": complex_result,
        })

在上面的示例中,我们创建了一个IncredibleInputSerializer来验证model_input查询参数,以确保它包含在请求中。这是一个非常基本的示例,因为Django REST Framework支持对输入执行其他操作,例如将其转换为符合特定格式的数字or validating

当然,如果您需要序列化对象或对象列表,那就是Django REST Framework擅长的地方。它不一定是模型对象,它可以是具有获取数据的属性或方法的对象,甚至只是一个基本字典,Django REST Framework应该能够为您序列化它。