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

Pat*_*ick 8 python django tastypie django-rest-framework

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

curl http://localhost:8000/.../?model_input='XYZ' 
Run Code Online (Sandbox Code Playgroud)

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

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

Kev*_*own 7

Django REST Framework不需要模型源或查询集,但在使用它们时它确实表现最佳.它确实提供了一个基本Serializer基础APIView,以及允许在标准的基于Django类的视图之上使用内容协商的基本.

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

如果你只想返回一个基本值(你没有指定"矩阵乘法的结果"实际可能是什么),那么即使只使用基本视图也是手动完成所有操作的一步.ResponseDjango REST Framework提供的对象允许您返回任意数据,并将其自动转换为类似的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,
        })
Run Code Online (Sandbox Code Playgroud)

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

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