2013-07-05 7 views
11

W django RestFramework, czy istnieje jakiś "oficjalny" sposób generowania dokumentacji dla "Korzenia Api"?W Django RestFramework, jak zmienić dokumentację Api Root?

Po obejrzeniu kodu źródłowego RestFramework jest, znalazłem obejście przez instacji DefaultRouter:

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

jest tam czystsze lub lepszy sposób?

Odpowiedz

7

Jestem nowy w tym, ale znalazłem, że możesz użyć SimpleRouter zamiast DefaultRouter do określenia własnego APIRoot.

w urls.py w module api

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

Następnie określ dokumentację w komentarzu klasy

from rest_framework import generics 

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

+0

ze swoim podejściem, używając 'SimpleRouter' lub' DefaultRouter' naprawdę nie ma znaczenia. Nadal możesz używać 'DefaultRouter' bez żadnego problemu. Zwłaszcza jeśli potrzebujesz przyrostka [** endix **] (http://www.django-rest-framework.org/api-guide/routers/#defaultrouter). – Yeo

+0

Jaki byłby najlepszy sposób robienia tego samego, ale nie łamiąc niczego innego? Mam na myśli to, że całkowicie zastępuje zwykły widok główny API, więc wszystko może przestać działać. – Joakim

3

To trochę trudno zastąpić klasę APIRoot. Najprostszym sposobem, aby osiągnąć to, co chcesz, jest prawdopodobnie zmodyfikować atrybut APIRootClass __doc__ przy starcie w swojej urls.py:

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

W Pythonie 2 otrzymujesz wyjątek próbujący napisać '__doc__' – Joakim

8

znalazłem rozwiązanie poprzez eksperymentowanie.

Wolę to od innych rozwiązań w tym wątku, ponieważ wymaga mniej kodu i pozwala dostosować tytuł API, a także dokumentację dla głównego katalogu API.

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) 

To świadczy, jak poniżej:

Demonstration

Powiązane problemy