Маршрут Django REST Framework не отображается в списке API
Я столкнулся с проблемой в Django REST Framework, где определенный маршрут не отображается в списке API, когда я обращаюсь к https://myserver.com/api/. Вот моя настройка:
url.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from . import views
router = DefaultRouter()
router.register(r'myapi', views.myapiViewSet, basename='myapi')
urlpatterns = [
path('api/', include(router.urls)),
# Other URL patterns
]
views.py
class myapiViewSet(ViewSet):
permission_classes = (MaintenanceCheck,)
throttle_classes = [UserRateThrottle]
Когда я посещаю https://myserver.com/api/, я ожидаю увидеть конечную точку myapi, но она не появляется, и когда я могу обратиться к https://myserver.com/api/myapi/ напрямую, она не работает и показывает мне "Not Found\n The requested resource was not found on this server."
- Маршрутизатор правильно включен в основной URL conf.
- Представление myapi является правильным набором представлений.
- Префикс URL api/ используется правильно.
Я не могу понять, почему конечная точка myapi не отображается в списке API. Любые соображения или предложения будут очень признательны!
Viewset
Ваш набор представлений не раскрывает никаких представлений, поэтому вы получаете 404 Not Found
при обращении к url.
Предложите действие, переопределив конечную точку по умолчанию или добавив собственный обработчик пути с помощью @action
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.viewsets import ViewSet
class myapiViewSet(ViewSet):
# ...
def list(self, request):
return Response("/ root path endpoint")
@action(detail=False, methods=['GET'])
def custom(self, request, *args, **kwargs):
return Response("custom/ endpoint")
Или используйте что-то вроде ModelViewSet
, и DRF сгенерирует конечную точку для вас.
Документы: https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions
Маршрутизация
Ваш маршрутизатор выставлен правильно, однако если вы хотите получить доступ к набору просмотров напрямую по пути api/
, оставьте путь регистрации пустым:
router = DefaultRouter()
router.register('', views.myapiViewSet, basename='myapi')