我是Django REST框架的初学者,需要你的建议。我正在开发Web服务。该服务必须提供与其他服务的REST接口。我需要实现的REST接口无法直接与我的模型一起使用(我的意思是获取,放置,发布,删除操作)。相反,它为其他服务提供了一些计算结果。根据请求,我的服务会进行一些计算,只是将结果返回(不将结果存储在自己的数据库中)。
以下是我对如何实现REST接口的理解。纠正我,如果我错了。
我错过了什么?该方法总体上正确吗?
即使没有将Django-rest-frame绑定到模型,它也可以很好地工作。你的方法听起来不错,但我相信你可以减少一些步骤,以使所有工作正常进行。
例如,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 ] ]
希望这可以帮助你。