我是Django REST框架的初学者,需要您的建议。我正在开发一个web服务。该服务必须向其他服务提供REST接口。我需要实现的REST接口并不直接与我的模型一起工作(我指的是get、put、post和delete操作)。取而代之的是,它向其他服务提供一些计算结果。在一个请求中,我的服务进行一些计算并返回结果(不将结果存储在自己的数据库中)。
下面是我对如何实现REST接口的理解。纠正我,如果我错了。
我错过什么了吗?这个方法大体上是正确的吗?
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使用者表示。
以下几个片段可能会帮助您:
请注意,我没有测试过这个。它只是作为一个例子,但它应该起作用:)
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
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”
来指定希望返回的编码。
[
[
1,
2,
3
],
[
4,
5,
6
]
]
希望这能帮到你。