В 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)
это отображает, как показано ниже:
Это трудно переопределить класс 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)
})