我正在开发一个RESTful应用程序,其目标是允许用户跟踪他在体育活动中的结果,进度和表现。
我想为此应用创建两个或更多客户端:
1)网络客户端
2)移动客户端(iOS / Android)
我正在使用tastypie应用程序在django中编写它,我想知道我是否应该在同一个应用程序中创建Web客户端,这将提供RESTful api,或者我应该将其作为纯REST服务并构建单独的Web客户端,这将是通过api联系它?
就目前而言,我没有看到将两者结合在一起的任何缺点,但我不是具有这种架构的程序的专家,所以我正在寻找一些建议背后的论证。
答案 0 :(得分:7)
要回答这个问题并不容易,因为它很大程度上取决于您正在构建的服务类型。
在这里,您的Django-app和tastpie API共享通用数据模型,但以不同方式呈现它们。一个使用Djangos模板和视图,另一个使用tastypie。
优点:
缺点:
通过tastypie
API只有一个服务接口。网络客户端是使用backbone.js
和backbone-tastypie
之类的javascript工具单独构建的。
优点:
缺点:
与方法1非常相似,但不是直接使用模型,而是在内部调用tastypie
资源。
优点:
缺点:
答案 1 :(得分:1)
第四种方法可以做到这一点,它延伸到@ seppo-erviälä方法1和方法2:
创建一个返回RESTful资源的处理程序,就像RESTful API视图一样。但是这个处理程序可以从任何地方调用。它获取视图获取的相同请求字典,并返回视图返回的相同JSON。所以现在,架构是:
Handler
/ | \
/ | \
/ | \
/ | \
RESTfulView | Normal Django View
|
Anything Else
处理程序:
class ResourceHandler:
def create_resource(self, data):
# code
def fetch_resource(self, rId):
# code
# and so on
你可以从像这样的视图中调用它:
# /views/restfulview.py
# using django-rest-framework
from rest_framework.response import Response
class RESTCallView(APIView):
h = ResourceHandler()
def get(self, request, rId):
return Response(self.h.fetch_resource(rId))
# /views/normalview.py
from django.views.generic.base import TemplateView
class SomeDjangoView(TemplateView):
h = ResourceHandler()
def get(self, request, rId):
return HttpResponse(self.h.fetch_resource(rId))
当然,这只是示例代码而不是真正的pythonic,但你明白了。
我在一家大型电子商务公司工作,我的一些队友使用这种方法取得了很好的成功
其他一些优点是:
dict
并将其发送到Handler
。同样,同步也变得容易多了。希望这对你有帮助.. :))
答案 2 :(得分:0)
更好地创建纯REST服务并从客户端使用它。它将提供一个干净的分层架构,因为您没有在一个应用程序中将服务与客户端混合。通过单独提供公共服务,您将拥有:关注点分离,清洁架构,正确布局,可读性和更好的可维护性。