2013-07-05 20 views
11

django RestFramework'da "Api Root" için belgelerin üretilmesi için herhangi bir "resmi" yol var mı?Django RestFramework'da, Api Kök belgeleri nasıl değiştirilir?

from rest_framework import routers 

class MyRouter(routers.DefaultRouter): 
    def get_api_root_view(self): 
     api_root_view = super(MyRouter, self).get_api_root_view() 
     ApiRootClass = api_root_view.cls 

     class MyAPIRoot(ApiRootClass): 
      """My API Root documentation""" 
      pass 

     return MyAPIRoot.as_view() 

router = MyRouter() 

daha temiz ya da daha iyi bir yolu var mı:

RestFramework kaynak koduna baktıktan sonra defaultrouter sınıflara göre geçici bir çözüm bulduk?

cevap

7

Buna yeniyim ama DefaultRouter yerine kendi APIRoot kodunuzu belirtmek için SimpleRouter kullanabilirsiniz. Lütfen api modülünde urls.py yılında

from django.conf.urls import patterns, url, include 
from rest_framework.routers import SimpleRouter 
router = SimpleRouter() 

urlpatterns = patterns('api.views', 
    url(r'^$', views.APIRoot.as_view()), 
    url(r'', include(router.urls)), 
) 

Sonra sınıf comment

from rest_framework import generics 

class APIRoot(generics.GenericAPIView): 
    """ 
    My API documentation 
    """ 

+0

:

from rest_framework import routers class ThisWillBeTheApiTitleView(routers.APIRootView): """ This appears where the docstring goes! """ pass class DocumentedRouter(routers.DefaultRouter): APIRootView = ThisWillBeTheApiTitleView router = DocumentedRouter() router.register(r'items', ItemsViewSet) 

Bu aşağıda vermektedir. 'DefaultRouter''ı hala sorunsuz kullanabilirsiniz. Özellikle, sağlanan [** format sonek **] (http://www.django-rest-framework.org/api-guide/routers/#defaultrouter) gerekiyorsa. – Yeo

+0

Aynı şeyi yapmanın en iyi yolu ne olurdu, ama başka bir şeyi kırmamanız? Bunun anlamı normal API kökü görünümünün üzerine yazılıyor, bu yüzden işler çalışmayabilir. – Joakim

3

Biraz zor APIRoot sınıfını geçersiz kılmak için var belgeleri belirtin. İstediğinizi elde etmek en basit yolu, senin urls.py yılında zamanında APIRootClass ait __doc__ niteliğini değiştirmek için muhtemelen:

class Router(routers.DefaultRouter): 
    def get_api_root_view(self, api_urls=None): 
     root_view = super(Router, self).get_api_root_view(api_urls=api_urls) 
     root_view.cls.__doc__ = "Place your documentation here" 
     return root_view 

router = Router() 
router.register(...) 

urlpatterns = [ 
    url(r'^', include(router.urls)), 
] 
+0

Python 2'de '__doc__' yazmaya çalışmak için bir istisna var. – Joakim

8

Ben deneyler yoluyla bir çözüm buldum.

Daha az kod gerektiren ve API köküne ilişkin belgelerin yanı sıra API başlığını özelleştirebilmenizi sağladığı için, bu iş parçasındaki diğer çözümlere tercih ediyorum. DefaultRouter` gerçekten önemli değil `kullanarak SimpleRouter` veya` senin yaklaşımla

Demonstration