【问题标题】:Django and REST API to serve calculation-based requestsDjango 和 REST API 来服务基于计算的请求
【发布时间】:2015-03-03 09:22:59
【问题描述】:

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

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

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

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

【问题讨论】:

标签: python django django-rest-framework tastypie


【解决方案1】:

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

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

如果您只是想返回一个基本值(您没有指定“矩阵乘法的结果”实际上可能是什么),那么即使只使用基本视图也比手动完成这一切都要高出一步。 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 应该能够为你序列化它。

【讨论】:

  • 非常感谢凯文,非常感谢您的回答!我意识到这可能是问题的另一个方面,但是在您的示例中是否有办法避免每次发送请求时加载矩阵?换句话说,矩阵 - 非常大 - 对于所有请求都是相同的,我只想在服务器启动时加载一次。最好的问候,帕特里克
  • 这样做需要设置某种全局状态,这将根据您需要数据的位置而有所不同,但you can hook into Django's ready events 可以做到。
  • 感谢凯文的链接。在阅读了 Pykler 的帖子后,我了解到可以在服务器启动时执行一些代码,但我仍然不确定如何共享数据。无论如何,我会在那里解决这个具体问题。再次感谢帕特里克
  • 我遇到了与您描述 Patrick 相同的问题,我确实使用 [zeromq.org] 找到了解决方案。我有一个 C++ 程序在后台运行,等待通过 ZMQ 发送任务(并在启动时将重对象加载到内存中)。每次请求到达我的 django API 时,xyz 都会作为消息发送到 C++ 程序,该程序执行计算,并将结果发送回 python。许多“python 客户端”可以同时向同一个“C++ 服务器”发送请求。非常方便,但需要一些设置。
猜你喜欢
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 2020-06-21
  • 2016-02-19
  • 2012-06-12
  • 2014-12-22
  • 2013-02-26
  • 2018-01-13
相关资源
最近更新 更多