2014-04-02 157 views
6

我們使用Django構建web-app後端,爲Ember應用程序提供RESTful API。Django REST框架 - 多個模型/ 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 

哪種方法更好?這裏常見的最佳實踐是什麼? 有沒有我們可以看一看的開放項目?

回答

9

我正在用像Django一樣構建一個寧靜的API。我正在做的是讓應用程序獨立於最後一個例子。

我們有一個「核心」django應用程序,其中我們有視圖中的api_root和名爲「apis_urls.py」的文件,我們在這裏組織來自不同應用程序的所有URL。

我們也有這個「核心」應用程序文件「apis_filters.py」我們有與API的任何應用程序可用於管理使用的API和進口的權限過濾器和「apis_permissions.py」其他應用。

所以在最後,我們正在努力這樣的:

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網址:

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>[\[email protected]+-]+)/$', 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'), 
) 

我希望這個幫助,是我發現它的方式更加組織。