В 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()
Есть ли более чистый или лучший способ?
Ответы
Ответ 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)),
]