我是 Django REST 框架的初学者,需要您的建议。我正在开发一个网络服务。该服务必须为其他服务提供 REST 接口。我需要实现的 REST 接口不能直接使用我的模型(我的意思是获取、放置、发布、删除操作)。相反,它为其他服务提供了一些计算结果。根据请求,我的服务会进行一些计算并仅返回结果(不将结果存储在自己的数据库中)。
以下是我对如何实现 REST 接口的理解。纠正我,如果我错了。
创建进行计算的类。将其命名为“CalcClass”。CalcClass 在其工作中使用模型。
创建结果类。
派生自对象。
为 ResultClass 创建序列化程序。
从 serializers.Serializer 派生。
创建视图返回计算结果。
从 APIView 派生。
网址
在我的情况下没有 api root。我应该只有 URL 来获得各种计算结果(使用 diff 参数计算)。
我错过了什么?这种方法总体上是正确的吗?
即使没有将其绑定到模型,Django-rest-framework 也能很好地工作。您的方法听起来不错,但我相信您可以减少一些步骤以使一切正常。
例如,rest 框架带有一些内置的渲染器。开箱即用,它可以将 JSON 和 XML 返回给 API 使用者。您还可以通过安装所需的 python 模块来启用 YAML。Django-rest-framework 将输出任何基本对象,如 dict、list 和 tuple,而无需您做任何额外的工作。
所以基本上你只需要创建接受参数的函数或类,执行所有必需的计算并将其结果以元组的形式返回到 REST api 视图。如果 JSON 和/或 XML 符合您的需求,django-rest-framework 将为您处理序列化。
在这种情况下,您可以跳过第 2 步和第 3 步,只使用一个类进行计算,一个类用于向 API 使用者展示。
这里有一些片段可以帮助你:
请注意,我没有对此进行测试。 这只是一个例子,但它应该可以工作:)
计算类:
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
REST 视图:
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"到标头来指定您希望返回的编码。
?format=json
.json
"Content-type"
"Accept"
[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
希望这可以帮助你。