Подтвердить что ты не робот

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

В django RestFramework есть ли "официальный" способ генерации документации для "Api Root"?

Посмотрев исходный код 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()

Есть ли более чистый или лучший способ?

4b9b3361

Ответ 1

Я новичок в этом, но я обнаружил, что вы можете использовать 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
    """

Ответ 2

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

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

Это выглядит следующим образом:

Демонстрация

Ответ 3

Трудно переопределить класс 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)),
]