0

I am using DRF router with a prefix + include like this:

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

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

This allows me to hit the both api/1 and api/1/myfeature URLS. How can I prevent the first URL from returning 200's? The response of that endpoint is a list of everything registered under the router which I don't want to make easily obtainable.

s g
  • 5,289
  • 10
  • 49
  • 82

2 Answers2

0
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)
Ykh
  • 7,567
  • 1
  • 22
  • 31
0

Two steps:

1) Wire a view directly to the prefix url (use the $)

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

2) Define the view.

There is a one-liner that Django provides - django.views.defaults.page_not_found. However, in newer versions of Django, this requires an exception parameter so you can't do it in a one-liner. Thus, we have something like this:

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)),]
s g
  • 5,289
  • 10
  • 49
  • 82