Django Маршрутизатор Rest Framework - исключить URL для префикса - PullRequest
0 голосов
/ 18 июня 2020

Я использую DRF-маршрутизатор с префиксом + include , например:

router = BulkRouter()
router.register(r"myfeature", MyfeatureViewSet, base_name="myfeature")

urlpatterns = [
    url(r"^api/1/", include(router.urls)),]

Это позволяет мне использовать как api/1, так и api/1/myfeature URL. Как я могу запретить первому URL-адресу возвращать 200? Ответ этой конечной точки представляет собой список всего, что зарегистрировано на маршрутизаторе, что я не хочу делать легко доступным.

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Два шага:

1) Подключите представление непосредственно к URL-адресу префикса (используйте $)

urlpatterns = [
    url(r"^api/1/$", some_view,
    url(r"^api/1/", include(router.urls)),]

2) Определите представление.

Есть однострочник, который Django предоставляет - django.views.defaults.page_not_found. Однако в более новых версиях Django для этого требуется параметр исключения, поэтому вы не можете сделать это в однострочном режиме. Таким образом, мы имеем что-то вроде этого:

def page_not_found_custom(request):
    return page_not_found(request, None)

urlpatterns = [
    url(r"^api/1/$", page_not_found_custom,
    url(r"^api/1/", include(router.urls)),]
0 голосов
/ 18 июня 2020
from rest_framework.response import Response
from rest_framework import status
from rest_framework.viewsets import ModelViewSet

class UserViewSet(ModelViewSet):
    def list(self, request, *args, **kwargs):
        return Response(data='Not allow', status=status.HTTP_400_BAD_REQUEST)
...