Маршрутизация просмотров API в Django Rest Framework?
Существует ли общий шаблон маршрутизации APIViews
(т.е. не ViewSets
) с Django Rest Framework?
Например, если у меня есть API-представление, которое принимает необязательный аргумент:
class ReportView(APIView):
def get(self, request, report_name=None):
# … stuff …
return Response(report)
Есть ли какой-либо стандартный шаблон - помимо написания стандартного маршрутизатора Django URL-адресов - для маршрутизации этого представления?
Ответы
Ответ 1
Есть ли какой-либо стандартный шаблон - помимо написания стандартного маршрутизатора Django URL-адресов - для маршрутизации этого представления?
ViewSets и Routers - это шаблон, если вы хотите стандартизованную маршрутизацию.
Если вы используете представления, просто используйте обычный URL-адрес Django.
Ответ 2
Возможность добавления простых представлений API весьма полезна для отображения URL-адресов в представлении root-api
.
Вот простейшее расширение DefaultRouter
, которое позволяет регистрировать не только виды, но и простые представления API:
from django.conf.urls import url
from rest_framework import routers, viewsets
from rest_framework.urlpatterns import format_suffix_patterns
class DefaultRouterWithSimpleViews(routers.DefaultRouter):
"""
Extends functionality of DefaultRouter adding possibility
to register simple API views, not just Viewsets.
"""
def get_routes(self, viewset):
"""
Checks if the viewset is an instance of ViewSet,
otherwise assumes it a simple view and does not run
original `get_routes` code.
"""
if issubclass(viewset, viewsets.ViewSetMixin):
return super(DefaultRouterWithSimpleViews, self).get_routes(viewset)
return []
def get_urls(self):
"""
Append non-viewset views to the urls
generated by the original `get_urls` method.
"""
# URLs for simple views
ret = []
for prefix, viewset, basename in self.registry:
# Skip viewsets
if issubclass(viewset, viewsets.ViewSetMixin):
continue
# URL regex
regex = '{prefix}{trailing_slash}$'.format(
prefix=prefix,
trailing_slash=self.trailing_slash
)
# The view name has to have suffix "-list" due to specifics
# of the DefaultRouter implementation.
ret.append(url(
regex, viewset.as_view(),
name='{0}-list'.format(basename)
))
# Format suffixes
ret = format_suffix_patterns(ret, allowed=['json', 'html'])
# Prepend URLs for viewsets and return
return super(DefaultRouterWithSimpleViews, self).get_urls() + ret
Теперь вы можете использовать простые представления Django вместе с остальной структурой ViewSets:
router = DefaultRouterWithSimpleViews()
router.register(r'users', UserViewSet, 'users') # <- Viewset!
router.register(r'reset-pwd', ResetPasswordView, 'reset_pwd') # <- Simple view!
urlpatterns = router.urls
Обновление: Добавлена поддержка суффиксов формата (благодаря alexander-klimenko)