【问题标题】:Django REST Framework - multiple models / APIs?Django REST Framework - 多个模型/API?
【发布时间】:2014-05-13 00:49:29
【问题描述】:

我们使用 Django 构建 web-app 后端,为 Ember 应用提供 RESTful API。

所以(进化上)我们从以下简单结构开始:

project root
|
|-app1 / models.py .... no views.py
|
|-app2 / models.py .... no views.py
|
|-app3 / models.py .... no views.py
|
\- restapi - provides REST API for app*: huge views.py, huge serializers.py, huge test.py

这很容易使用,尤其是 DRF 的可浏览视图:

@api_view(['GET'])
def api_root(request, format=None):
    return Response(
        {
            'users': reverse('current-user-detail', request=request),
            'interfacesettings': reverse('interface-settings', request=request),
            ............................................................     
            'preferences': reverse('preferences', request=request),
        }
    )

很快我们就有足够多的模型/API 让我们的 restapi.app 变得过于复杂和混乱,我们开始考虑使用更合乎逻辑的东西:

project root
|
|-app1 / models.py .... views.py, serializers.py, tests.py
|
|-app2 / models.py .... views.py, serializers.py, tests.py
|
|-app3 / models.py .... views.py, serializers.py, tests.py
|
\- we do not need rest api anymore (but where will we put our api_root?)

另一方面,我们现在将所有复杂的测试(涉及很少的模型)放在一个方便的地方。而且我们重用序列化器的功能很多。我们有一个 api_root。所以我们可能会有这样的事情:

project root
|
|-app1 / models.py .... views.py (app1 API), serializers.py, tests.py
|
|-app2 / models.py .... views.py (app2 API), serializers.py, tests.py
|
|-app3 / models.py .... views.py (app3 API), serializers.py, tests.py
|
\- restapi - views.py (api_root), tests.py for complicated tests and serializers.py for common functions

哪种方法更好?这里有哪些常见的最佳实践? 有没有开放的项目我们可以看看?

【问题讨论】:

    标签: django django-rest-framework django-testing


    【解决方案1】:

    我也在像你一样使用 Django 构建一个宁静的 API。我正在做的是让应用程序像上一个示例一样独立。

    我们有一个“核心”django 应用程序,其中视图中有 api_root 和一个名为“apis_urls.py”的文件,我们在其中组织来自不同应用程序的所有 URL。

    我们在这个“核心”应用程序中还有一个文件“apis_filters.py”,其中我们有任何具有 API 的应用程序都可以使用的过滤器和“apis_permissions.py”来管理使用 api 和导入另一个的权限应用程序。

    所以最后我们是这样工作的:

    project root
    |
    |-app1 / models.py .... views.py (app1 API), serializers.py, tests.py
    |
    |-app2 / models.py .... views.py (app2 API), serializers.py, tests.py
    |
    |-app3 / models.py .... views.py (app3 API), serializers.py, tests.py
    |
    \- core / views.py (api_root), apis_urls.py,  apis_filters.py,  apis_permissions.py
    

    我们在其相应的应用程序中进行所有测试。

    并且拥有 apis_urls.py 允许我们拥有所有 API URL,例如:

    http://localhost/api/v1/example1
    http://localhost/api/v1/example2
    

    在主 urls.py 我们有:

    url(r'^api/v1/', include('core.apis_urls', namespace='api')),
    

    在核心应用上,在“apis_urls.py”:

    urlpatterns = patterns(
    '',
        ####### Users Urls
        url(r'^users/$', users_views.UserListAPIView.as_view(), name='users-list-api'),
        url(r'^me/$', users_views.LoggedUserRetrieveUpdateAPIView.as_view(), name='logged-user-detail-api'),
        url(r'^users/(?P<username>[\w.@+-]+)/$', users_views.UserRetrieveAPIView.as_view(), name='users-detail-api'),
    
        ####### Comments Urls
        url(r'^comments/(?P<pk>[0-9]+)$', comments_api_views.CommentCreateAPIView.as_view(), name='comments-create-api'),
    )
    

    我希望这个帮助,是我发现它更有条理的方式。

    【讨论】:

      猜你喜欢
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 2014-08-20
      • 2014-01-09
      • 2014-11-12
      • 2021-08-19
      相关资源
      最近更新 更多