我是Django 睡觉框架的初学者,需要你的建议.我正在开发一项网络服务.该服务必须提供与其他服务的睡觉接口.我需要实现的睡觉接口不能直接处理我的模型(我指的是GET、PUT、POST、DELETE操作).相反,它向其他服务提供一些计算结果.根据请求,我的服务进行一些计算,然后只返回结果(不将结果存储在它自己的数据库中).

下面是我对如何实现REST接口的理解.如果我错了,请纠正我.

  1. Create class which makes the calculations. Name it 'CalcClass'. CalcClass uses the models in its work.
    • 计算所需的参数被传递给构造函数.
    • 执行计算操作.它以"ResultClass"形式返回结果.
  2. Create ResultClass.
    • 派生自对象.
    • 它只具有包含计算结果的属性.
    • 计算结果的一部分被表示为元组的元组.据我所知,进一步的序列化最好是为这些结果实现一个单独的类,并将这些对象的列表添加到ResultClass中.
  3. Create Serializer for ResultClass.
    • 派生自Serializers.Serializer.
    • 计算结果是只读的,因此主要对字段使用Field类,而不是专用类,如IntegerField.
    • 我既不应该在ResultClass上实施save()方法,也不应该在序列化程序上实施save()方法,因为我不打算存储结果(我只想在请求时返回它们).
    • 增加嵌套结果的串行化程序(记住上面提到的元组的元组).
  4. Create View to return calculation results.
    • 源自APIView.
    • 只需获取()即可.
    • 在get()中使用从请求中检索到的params创建CalcClass,调用其calc(),获取ResultClass,创建序列化程序并将ResultClass传递给它,返回响应(seralizer.data).
  5. URLs
    • 在我的例子中没有API根.我应该只有URL,以获得各种计算结果(计算与不同的参数).
    • 添加API浏览调用Format_Suffix_Patterns.

我错过什么了吗?这种做法大体上是正确的吗?

推荐答案

Django-睡觉-框架运行良好,即使不将其与模型Bundle 在一起.你的方法听起来不错,但我相信你可以减少一些步骤,让一切都运转起来.

例如,睡觉框架附带了一些内置渲染器.它可以开箱即用地将JSON和XML返回给API使用者.您还可以通过只安装所需的python模块来启用YAML.django-睡觉-framework可以输出任何基本对象,如dict、list和tuple,不需要您做任何额外的工作.

因此,基本上您只需创建接受参数的函数或类,执行所有必需的计算,并将其结果以元组形式返回给睡觉API视图.如果json和/或xml满足您的需要,django-睡觉-framework将为您处理序列化.

在本例中,您可以跳过第2步和第3步,只使用一个类进行计算,并使用一个类向API使用者呈现.

以下是一些可能对您有所帮助的片段:

Please note that I have not tested this. It's only meant as an example, but it should work :)

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时,此代码应该会输出列表列表.如果使用后缀,你可以用.json来替身.您还可以通过将"Content-type""Accept"添加到标头来指定您希望返回的编码.

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

希望这能帮到你.

Django相关问答推荐

如何在Django中更改模型字段名称?

Django Model邮箱字段是必需的,即使在我将其设置为NULL=True和BLACK=True之后也是如此

Django后端对印前判断请求未通过访问控制判断给我以下回应:否访问控制允许来源

Django中每个类型/代理的最新行

错误``Forbidden (403) CSRF 验证失败.请求中止.``` 当try 登录管理员时

情节主题更改问题

如果一个应用程序有多个具有相同字段的模型,那么保持 DRY 的最佳实践是什么?

Django模型中的密码字段

Django - 将 HTML 输出转换为变量

当我告诉它时,如何使用 Django 的记录器来记录回溯?

EmailBackend 用于在 Django 中通过多个 SMTP 发送邮箱

如何获得用户权限?

什么时候在 django rest 框架序列化程序中调用创建和更新?

Django - 站点匹配查询不存在

Django - 强制执行 ManyToManyField 唯一项

如何在 django 模板中将名称反转为绝对 url?

Django:如何从模板调用视图函数?

在 django 模板中遇到 user.is_authenticated 问题

如何使用 SQL 的IN等字段上的数组过滤 django 查询集?

清理提交的表单数据中的 HTML