2013-07-05 4 views
11

In django RestFramework, esiste un modo "ufficiale" per generare la documentazione per "Api Root"?In Django RestFramework, come modificare la documentazione di Api Root?

Dopo aver guardato il codice sorgente del RestFramework, ho trovato un lavoro in giro per la sottoclasse 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() 

C'è un detergente o un modo migliore?

risposta

7

Sono nuovo, ma ho trovato che è possibile utilizzare uno SimpleRouter anziché uno DefaultRouter per specificare il proprio APIRoot.

in urls.py nel vostro modulo di 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)), 
) 

quindi specificare la documentazione nel commento della classe

from rest_framework import generics 

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

+0

con il vostro approccio, utilizzando '' SimpleRouter' o DefaultRouter' non ha molta importanza. Puoi ancora usare 'DefaultRouter' senza alcun problema. Soprattutto se hai bisogno del [** suffisso di formato **] (http://www.django-rest-framework.org/api-guide/routers/#defaultrouter) fornito da esso. – Yeo

+0

Quale sarebbe il modo migliore per fare la stessa cosa, ma non rompere qualcos'altro? Voglio dire che questo sovrascrive completamente la normale vista radice API, quindi le cose potrebbero smettere di funzionare. – Joakim

3

È un po 'difficile da sostituire la classe APIRoot. Il modo più semplice per ottenere ciò che si vuole è probabilmente quello di modificare l'attributo __doc__ del APIRootClass in fase di esecuzione in 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

In Python 2 si ottiene un'eccezione cercando di scrivere '__doc__' – Joakim

8

ho trovato una soluzione attraverso la sperimentazione.

Preferisco le altre soluzioni in questo thread in quanto richiede meno codice e consente di personalizzare il titolo dell'API, nonché la documentazione per la radice dell'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) 

Questo rende come di seguito:

Demonstration