Ошибка Django: 404 Страница не найдена при использовании метода get

Я пытаюсь получить сериализованные данные из конечной точки localhost:8000/v1/test/uuid, но получаю ошибку 404 - что не так?

views.py

  • из uuid в ответ получаем объект сайта
class Test(APIView):
    def get(self, request, *args, **kwargs):
        uuid = kwargs.get('uuid')
        resp = {'site': None}
        
        site = Site.objects.get(uuid=uuid)
        resp['site'] = SiteSerializer(site).data
        return Response(resp)

urls.py

from django.conf.urls import re_path

from rest_framework.routers import DefaultRouter

from site_config import views

router = DefaultRouter()

router.register(
    r'site',
    views.SiteViewSet,
    basename='site')


urlpatterns = [
    re_path(r'^v1/', include(router.urls)),
    re_path('test/<uuid:uuid>/', views.Test.as_view(), name='test'),
]

models.py

  • сайт id как пк
class Site(models.Model):
    """
    Model that represents a Site
    """
    uuid = models.UUIDField(
        default=uuid.uuid4,
        editable=False,
        unique=True)
    domain_name = models.CharField(max_length=255, unique=True)
    created = models.DateTimeField(editable=False, auto_now_add=True)
    modified = models.DateTimeField(editable=False, auto_now=True)

serializers.py

class SiteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Site
        fields = [
            'uuid',
            'domain_name'
        ]

FYI - конечная точка работала, когда views.py возвращала все сайты, но она не работает, когда я пытаюсь фильтровать по uuid.

views.py (ранее рабочая версия)

class Test(APIView):
    def get(self, request, *args, **kwargs):
        resp = {'site': None}
        site = Site.objects.all()
        resp['site'] = SiteSerializer(site, many=True).data
        return Response(resp)

FYI - конечная точка работала, когда views.py возвращал все Сайты, но не работает, когда я пытаюсь фильтровать по uuid.

Поскольку у меня нет анализа точки останова для вашего кода views.py, я предполагаю, что ваш метод get внутри

class Test(APIView):
    def get(self, request, *args, **kwargs):
        uuid = kwargs.get('uuid')
        resp = {'site': None}
        
        site = Site.objects.get(uuid=uuid)
        resp['site'] = SiteSerializer(site).data
        return Response(resp)

не разрешается шаблонами в вашем urls.py или uuid не проходит.

Если дело обстоит как раньше, то можно сделать прямое отображение UUID внутри метода get и избежать kwarg.get(), сделав следующее

class Test(APIView):
        def get(self, request, uuid, *args, **kwargs):
            uuid = uuid
            resp = {'site': None}
            
            site = Site.objects.get(uuid=uuid)
            resp['site'] = SiteSerializer(site).data
            return Response(resp)

urls.py

Поскольку это проблема маршрутизации, первым местом для поиска должен быть urls.py.

Не пересоздавая приложение, похоже, что здесь потенциально две проблемы:

Анализ

1. re_path

re_path используется регулярное выражение Django path. В документации django.urls есть несколько примеров, которые говорят сами за себя.

2. путь тает

Путь URL начинается с v1/, а предоставленная конфигурация начинается с test/.

3. приказ

Поскольку re_path для ^v1/ соответствует всему, что начинается с v1/, важен порядок в шаблоне.

Все, что должно быть доступно в пути шапки, должно быть либо перечислено перед regex-сочетанием, либо зарегистрировано в маршрутизаторе.

Fix

urlpatterns = [
    path('v1/test/<uuid:uuid>/', views.Test.as_view(), name='test'),
    re_path(r'^v1/', include(router.urls)),
]
Вернуться на верх