2014-04-02 31 views
6

Ember uygulaması için RESTful API sağlayan web uygulaması arka planı oluşturmak için Django kullanıyoruz.Django REST Framework - çoklu modeller/API'ler?

Yani (evrimsel) aşağıdaki basit yapıda başladı:

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 

Bu özellikle DRF en göz atılabilir görüntüsü, kullanımı kolaydır:

@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), 
     } 
    ) 

Kısaca biz var yeterince modelleri/Bizim restapi.app yolu çok karmaşık ve dağınık hale getirmek için API'lar ve daha mantıklı bir şey kullanmayı düşünmeye başladık:

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

Diğer tarafta, şimdi tek bir yerde tüm karmaşık testler (birkaç model içerir) uygun bir yere sahibiz. Diziselleştiricilerin işlevlerini tekrar kullanırız. Ve bir tane api_root var.

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 

yaklaşım daha iyidir: Yani muhtemelen böyle bir şey olabilir? Ve burada ortak en iyi uygulamalar nelerdir? Bakabileceğimiz açık bir proje var mı?

cevap

9

Sizin gibi Django ile de dinlendirici bir API yapıyorum. Yaptığım şey, son örneğiniz gibi bağımsız bir uygulama yapmak.

Görünümlerimizde api_root'umuz ve “apis_urls.py” adlı bir dosyada, farklı uygulamalardan tüm URL'leri düzenlediğimiz bir “çekirdek” django uygulamasına sahibiz.

Ayrıca, bu “temel” uygulamada “apis_filters.py” dosyasına sahibiz. API'ları olan herhangi bir uygulamanın kullanabileceği filtrelere ve apis_permissions.py'ye sahip olduğumuz filtrelere sahibiz. diğer uygulamalar.

Yani sonunda biz böyle çalışıyoruz:

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 

Biz bunlara karşılık gelen uygulamadaki tüm test yapmak.

Ve apis_urls.py sahip bize gibi tüm API URL'leri olmasını sağlar: Ana urls.py olarak

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

Elimizdeki: on

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

Ve çekirdek uygulamasında, “apis_urls.py”: Ben bu yardımı umut

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'), 
) 

, bunu daha organize etmek bulundu yoludur.

İlgili konular