Django 和 REST API 为基于计算的请求提供服务

Django and REST API to serve calculation-based requests

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

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

我想要 Django returns 给定输入 XYZ 的模型输出。我在 Tastypie 或 REST 框架中看到的每个示例都从查询集构建响应。如果响应不是查询集的结果而是内存纯计算的结果,我该如何继续?在我的例子中,响应是矩阵乘法(训练模型)乘以向量(输入)的结果,并且该结果未存储在 table.

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

Django REST Framework 不需要模型源或查询集,尽管它在使用它们中的任何一个时都能发挥最佳效果。 It does provide a basic Serializer for this reason, as well as basic APIView classes 允许在基于标准 Django class 的视图之上使用内容协商。

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

如果您只是在寻找 return 一个基本值(您没有指定 "the result of a matrix multiplication" 实际上可能是什么),那么即使只使用基本视图也比这样做更进一步全部手动。 Django REST Framework 提供的 Response 对象允许您 return 任意数据并自动将其转换为可比较的 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 应该能够为您序列化它。