В Django RestFramework, как изменить корневую документацию Api?

в Django RestFramework есть ли какой-либо" официальный "способ создания документации для" корня Api"?

после просмотра исходного кода RestFramework я нашел работу, подклассировав 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()

там чище или лучше ?

5 ответов


Я новичок в этом, но я нашел, что вы можете использовать SimpleRouter вместо DefaultRouter, чтобы указать свой собственный APIRoot.

на urls.py в вашем модуле 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)),
)

затем укажите документацию в комментарии класса

from rest_framework import generics

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


Я нашел решение путем экспериментов.

Я предпочитаю его другим решениям в этом потоке, поскольку он требует меньше кода и позволяет настроить заголовок API, а также документацию для корня 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)

это отображает, как показано ниже:

Demonstration


Это трудно переопределить класс APIRoot. Самый простой способ достичь того, что вы хотите, - это, вероятно, изменить __doc__ атрибут APIRootClass во время выполнения в вашем 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)),
]

Если кто-то хочет встроенный стиль

   router = DefaultRouter()

   router.get_api_root_view().cls.__name__ = "Root API name"
   router.get_api_root_view().cls.__doc__ = "Your Description"

@api_view(['GET'])
def api_root(request, format=None):
    return Response({
        'users': reverse('user-list', request=request, format=format),
        'snippets': reverse('snippet-list', request=request, format=format)
    })