Django的REST框架:非串行模式(Django REST framework: non-mod

2019-07-04 05:13发布

我是初学者在Django的REST框架,需要你的建议。 我开发一个Web服务。 该服务必须提供REST接口等服务。 REST接口,这是我需要执行,不与我的模型直接合作(我指的是GET,PUT,POST,删除等操作)。 相反,它提供其他服务的一些计算结果。 在请求我的服务提出了一些计算,只是把结果返回(不存储在自己的数据库中的结果)。

下面是我的是REST接口可以如何实现的认识。 纠正我,如果我错了。

  1. 创建类,这使得计算。 将它命名为“CalcClass”。 CalcClass使用模型的工作。
    • 必要的计算PARAMS传递给构造函数。
    • 实现计算操作。 它返回的结果为“ResultClass”。
  2. 创建ResultClass。
    • 从对象派生。
    • 它只是只含有钙结果的属性。
    • 该计算的结果的一部分被表示为元组的元组。 据我了解,这将是进一步系列化更好地落实这些结果一个单独的类并添加这些对象的列表ResultClass。
  3. 对于ResultClass创建串行。
    • 从serializers.Serializer派生。
    • 该计算结果是只读的,所以大多使用领域类的字段,而不是专门的类别,如IntegerField。
    • 我不应该IMPL save()方法既不ResultClass,也没有对串行的,因为我不会存储结果(我只是想要回他们的要求)。
    • IMPL串行器对嵌套的结果(记住上述元组的元组)。
  4. 创建视图返回计算结果。
    • 从APIView派生。
    • 只需要得到()。
    • 在get()方法从请求检索PARAMS创建CalcClass,调用其计算(),得到ResultClass,创建串行和ResultClass传递给它,返回响应(serializer.data)。
  5. 网址
    • 有一个在我的情况下,没有API的根。 我应该有网址,以获得不同的结果计算(计算值与差异PARAMS)。
    • 加入呼吁API浏览format_suffix_patterns。

我错过了什么? 是的做法是正确的,一般?

Answer 1:

Django的REST的架构运作良好,即使没有它绑到一个模型。 你的方法听起来不错,但我相信你可以修剪一些步骤,以使一切工作正常。

例如,其余的框架提供了一些内置的渲染器。 开箱即用它可以返回JSON和XML API的消费者。 您也可以只安装所需Python模块使YAML。 Django的REST的框架将输出的任何基本的物体,像字典,列表和元组无需您任何额外的工作。

所以基本上你只需要创建一个发生在自变量的函数或类,做了所有必要的计算,并在一个元组的REST API视图返回的结果。 如果JSON和/或XML适合您的需求,Django的休息框架会照顾系列化的为您服务。

您可以跳过步骤2和3在这种情况下,只是用于计算一个班,一个用于演示的API消费者。

这里有几个片段可以帮助你:

请注意,我没有测试过这一点。 它仅作为一个例子,但它应该工作:)

该CalcClass:

class CalcClass(object):

    def __init__(self, *args, **kw):
        # Initialize any variables you need from the input you get
        pass

    def do_work(self):
        # Do some calculations here
        # returns a tuple ((1,2,3, ), (4,5,6,))
        result = ((1,2,3, ), (4,5,6,)) # final result
        return result

其余的观点:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from MyProject.MyApp import CalcClass


class MyRESTView(APIView):

    def get(self, request, *args, **kw):
        # Process any get params that you may need
        # If you don't need to process get params,
        # you can skip this part
        get_arg1 = request.GET.get('arg1', None)
        get_arg2 = request.GET.get('arg2', None)

        # Any URL parameters get passed in **kw
        myClass = CalcClass(get_arg1, get_arg2, *args, **kw)
        result = myClass.do_work()
        response = Response(result, status=status.HTTP_200_OK)
        return response

您urls.py:

from MyProject.MyApp.views import MyRESTView
from django.conf.urls.defaults import *

urlpatterns = patterns('',
    # this URL passes resource_id in **kw to MyRESTView
    url(r'^api/v1.0/resource/(?P<resource_id>\d+)[/]?$', login_required(MyRESTView.as_view()), name='my_rest_view'),
    url(r'^api/v1.0/resource[/]?$', login_required(MyRESTView.as_view()), name='my_rest_view'),
)

这段代码应该输出,当你访问一个名单列表http://example.com/api/v1.0/resource/?format=json 。 如果使用的是后缀,可以替代?format=json.json 。 你也可以指定你想加入找回编码"Content-type""Accept"的标题。

[
  [
    1, 
    2, 
    3
  ], 
  [
    4, 
    5, 
    6
  ]
]

希望这可以帮助你。



文章来源: Django REST framework: non-model serializer