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

Маршрутизация просмотров 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-адресов - для маршрутизации этого представления?

4b9b3361

Ответ 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)