Django REST Framework-多个模型/ API?

问题描述 投票:7回答:1

我们使用Django构建Web应用程序后端,为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个回答
10
投票

我也在像您一样与Django建立一个Restful 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'),
)

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

© www.soinside.com 2019 - 2024. All rights reserved.