2013-07-05 8 views
11

Gibt es in django RestFramework eine "offizielle" Möglichkeit, die Dokumentation für den "Api Root" zu generieren?In Django RestFramework, wie ändert man die Api-Root-Dokumentation?

Nachdem in den Quellcode der RestFramework suchen, habe ich von Subklassen die default eine Arbeit um gefunden:

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

Gibt es einen Reiniger oder besseren Weg?

Antwort

7

Ich bin neu, aber ich fand, dass Sie SimpleRouter anstelle von DefaultRouter verwenden können, um Ihre eigenen APIRoot zu spezifizieren.

in urls.py in Ihrem api Modul

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

Geben Sie dann die Dokumentation in der Klasse Kommentar

from rest_framework import generics 

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

+0

mit Ihrem Ansatz mit 'SimpleRouter' oder' DefaultRouter' nicht wirklich wichtig. Sie können 'DefaultRouter' trotzdem problemlos verwenden. Vor allem, wenn Sie das [** Format Suffix **] (http://www.django-rest-framework.org/api-guide/routers/#defaultrouter) von ihm benötigt. – Yeo

+0

Was wäre der beste Weg, um das Gleiche zu tun, aber nichts anderes zu brechen? Ich meine, dies überschreibt vollständig die normale API-Root-Ansicht, so dass die Dinge möglicherweise nicht mehr funktionieren. – Joakim

3

Es ist eine Art schwierig, die APIRoot Klasse außer Kraft zu setzen. Die einfachste Art und Weise zu erreichen, was Sie wollen, ist wahrscheinlich das __doc__ Attribut des APIRootClass zur Laufzeit in Ihrem urls.py zu ändern:

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

In Python 2 erhalten Sie eine Ausnahme, die versucht, '__doc__' zu schreiben – Joakim

8

ich eine Lösung durch Experimente gefunden.

Ich bevorzuge es mit den anderen Lösungen in diesem Thread, da es weniger Code benötigt und Sie den API-Titel sowie die Dokumentation für den API-Stamm anpassen können.

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) 

Dies macht wie folgt:

Demonstration