Ошибка 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)),
]