2014-04-02 17 views
6

Chúng tôi sử dụng Django để xây dựng ứng dụng web phụ trợ, cung cấp RESTful API cho ứng dụng Ember.Khung công tác Django REST - nhiều mô hình/API?

Vì vậy, (evolutionally), chúng tôi bắt đầu với cấu trúc đơn giản sau đây:

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 

này rất dễ sử dụng, đặc biệt là với quan điểm có thể xem của 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), 
     } 
    ) 

Không lâu chúng tôi đã có mô hình đủ/API để làm cho cách restapi.app của chúng tôi quá phức tạp và lộn xộn và chúng tôi bắt đầu xem xét việc sử dụng một cái gì đó hợp lý hơn:

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?) 

Mặt khác, bây giờ chúng ta có tất cả các kiểm tra phức tạp (liên quan đến một vài mô hình) ở một nơi thuận tiện. Và chúng tôi sử dụng lại các chức năng của serializers rất nhiều. Và chúng ta có một api_root. Vì vậy, có lẽ chúng tôi có thể có một cái gì đó như thế này:

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 

Phương pháp nào tốt hơn? Và các phương pháp hay nhất phổ biến ở đây là gì? Có dự án mở nào chúng tôi có thể xem không?

Trả lời

9

Tôi đang xây dựng một API yên tĩnh cũng với Django như bạn. Những gì tôi đang làm là có một ứng dụng độc lập như ví dụ cuối cùng của bạn.

Chúng tôi có ứng dụng django “cốt lõi”, nơi chúng tôi có api_root trong chế độ xem và tệp có tên “apis_urls.py” nơi chúng tôi tổ chức tất cả các URL từ các ứng dụng khác nhau.

Chúng tôi cũng có ứng dụng "cốt lõi" này một tệp "apis_filters.py" nơi chúng tôi có các bộ lọc mà bất kỳ ứng dụng nào có API đều có thể sử dụng và "apis_permissions.py" để quản lý quyền sử dụng apis và nhập trên những ứng dụng khác.

Vì vậy, cuối cùng chúng tôi đang làm việc như thế này:

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 

Chúng tôi làm tất cả các xét nghiệm trong ứng dụng tương ứng của họ.

Và có apis_urls.py cho phép chúng ta có tất cả các URL API như:

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

Trong urls.py chính chúng ta có:

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

Và trên các ứng dụng cốt lõi, trên “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'), 
) 

Tôi hy vọng sự trợ giúp này, là cách tôi thấy nó tổ chức hơn.

Các vấn đề liên quan