REST应用程序架构

时间:2013-07-12 11:06:35

标签: django rest architecture tastypie

我正在开发一个RESTful应用程序,其目标是允许用户跟踪他在体育活动中的结果,进度和表现。

我想为此应用创建两个或更多客户端:

1)网络客户端

2)移动客户端(iOS / Android)

我正在使用tastypie应用程序在django中编写它,我想知道我是否应该在同一个应用程序中创建Web客户端,这将提供RESTful api,或者我应该将其作为纯REST服务并构建单独的Web客户端,这将是通过api联系它?

就目前而言,我没有看到将两者结合在一起的任何缺点,但我不是具有这种架构的程序的专家,所以我正在寻找一些建议背后的论证。

3 个答案:

答案 0 :(得分:7)

要回答这个问题并不容易,因为它很大程度上取决于您正在构建的服务类型。

方法1:传统的Django app + API

在这里,您的Django-app和tastpie API共享通用数据模型,但以不同方式呈现它们。一个使用Djangos模板和视图,另一个使用tastypie。

优点:

  • 构建传统的Web服务相对容易且易于理解
    • Django为此提供了很多工具

缺点:

  • 没有保证API提供与Web服务相同的功能
  • 您必须采用两种不同的方式与数据进行互动。

方法2:仅限API +使用API​​的JavaScript webapp

通过tastypie API只有一个服务接口。网络客户端是使用backbone.jsbackbone-tastypie之类的javascript工具单独构建的。

优点:

  • 您保证第三方开发人员可以使用与您的Web服务相同的功能构建服务(请参阅dogfooding)。
  • 如果您的服务更像是一个应用程序而不是一组页面,那么效果非常好。

缺点:

  • 客户端JavaScript工具不如Djangos(例如,模板)。
  • 模板的客户端呈现仅在加载大部分资源后发生。
    • 首页加载速度很慢
  • IE9以前的浏览器不会没有技巧,IE9可能需要技巧
  • 你真的需要考虑浏览器缓存
  • SEO并不像传统的网络服务那么简单。

方法3:仅API +从Django视图调用API

与方法1非常相似,但不是直接使用模型,而是在内部调用tastypie资源。

优点:

  • 您仍然可以使用大多数Django工具。
  • 您大多使用与潜在第三方开发者相同的API

缺点:

  • 我不知道会产生多少开销。

答案 1 :(得分:1)

第四种方法可以做到这一点,它延伸到@ seppo-erviälä方法1和方法2:

方法4:通过处理程序的API视图+ Django视图

创建一个返回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。同样,同步也变得容易多了。
  • 对API的更改位于一个位置,您可以切断应用程序而不会取消对数据的访问权限。

希望这对你有帮助.. :))

答案 2 :(得分:0)

更好地创建纯REST服务并从客户端使用它。它将提供一个干净的分层架构,因为您没有在一个应用程序中将服务与客户端混合。通过单独提供公共服务,您将拥有:关注点分离,清洁架构,正确布局,可读性和更好的可维护性。