Страница не найдена Django restframework
Я пытаюсь написать API на Django, чтобы получать комментарии пользователей из URL.
Мой API:
class ListSpecificUserCommentsApiView(APIView):
authentication_classes = [authentication.TokenAuthentication]
permission_classes = [permissions.AllowAny]
def get(self, request: HttpRequest, user) -> Response:
username: User = User.objects.get(id=user.id)
comments: Comment = Comment.objects.filter(user=username)
serialized_comments: CommentModelSerializer = CommentModelSerializer(instance=comments, many=True).data
return Response(serialized_comments)
и мой urls.py
:
urlpatterns = [
path(
route='users',
view=views.ListUsersApiView.as_view(),
name='users',
),
path(
route='comments/<user>',
view=views.ListSpecificUserCommentsApiView.as_view(),
name='user-comments',
),
]
и все равно я сталкиваюсь с этой ошибкой Page not found.
Я попытался передать пользователя в качестве данных в DRF Response
, как показано ниже:
class ListSpecificUserCommentsApiView(APIView):
authentication_classes = [authentication.TokenAuthentication]
permission_classes = [permissions.AllowAny]
def get(self, request: HttpRequest, user) -> Response:
username: User = User.objects.get(id=user.id)
comments: Comment = Comment.objects.filter(user=username)
serialized_comments: CommentModelSerializer = CommentModelSerializer(instance=comments, many=True).data
return Response(serialized_comments, data=user)
но это не сработало.
Я не нашел никаких проблем с кодом. Одна подозрительная деталь - отсутствие последнего '/' в пути к урлам.
urlpatterns = [
path(
route='users',
view=views.ListUsersApiView.as_view(),
name='users',
),
path(
route='comments/<user>',
view=views.ListSpecificUserCommentsApiView.as_view(),
name='user-comments',
),
]
Если отправить запрос, добавив '/' в конце указанного пути, возникнет ошибка "Страница не найдена".
Добавьте последний '/' к каждому пути и попробуйте снова!
urlpatterns = [
path(
route='users/',
view=views.ListUsersApiView.as_view(),
name='users',
),
path(
route='comments/<user>/',
view=views.ListSpecificUserCommentsApiView.as_view(),
name='user-comments',
),
]
Дополнительно
urlpatterns = [
...
path(
route='comments/<user>/',
view=views.ListSpecificUserCommentsApiView.as_view(),
name='user-comments',
),
]
Насколько я знаю, если вы не указываете тип для динамического пути, то значение, автоматически доставляемое по этому пути, имеет тип str. -> str(доставленное значение)
class ListSpecificUserCommentsApiView(APIView):
...
def get(self, request: HttpRequest, user) -> Response:
username: User = User.objects.get(id=user.id)
...
return Response(serialized_comments, data=user)
Когда вы пытаетесь импортировать объект пользователя через User.object.get, доставленный вами user.id пытается сослаться на id в str.
Возникает ошибка атрибута, потому что атрибут id не существует в объекте типа str.
Поскольку вы пытаетесь получить объект пользователя через id, измените динамический путь и функцию, как показано ниже.
#urls.py
urlpatterns = [
...
path(
route='comments/<int:user_id>/',
view=views.ListSpecificUserCommentsApiView.as_view(),
name='user-comments',
),
]
#views.py
class ListSpecificUserCommentsApiView(APIView):
...
def get(self, request: HttpRequest, user_id) -> Response:
username: User = User.objects.get(id=user_id)
...
return Response(serialized_comments, data=user)
Если вы пытаетесь получить объект пользователя через значение, отличное от id, пожалуйста, сообщите мне в комментариях, какое значение вы собираетесь получить!
Я понял, что в этом случае, используя APIView, я должен создать что-то вроде следующего кода в качестве моего Api View:
class ListSpecificUserCommentsApiView(APIView):
permission_classes = [permissions.AllowAny]
def get(self, request: HttpRequest, username) -> Response:
try:
user: User = User.objects.get(username=username)
except User.DoesNotExist:
return Response(
{'error': 'User not Found'},
status=status.HTTP_404_NOT_FOUND,
)
comments: Comment = Comment.objects.filter(user=user)
serialized_comments: CommentModelSerializer = CommentModelSerializer(comments, many=True)
return Response(
data=serialized_comments.data,
status=status.HTTP_302_FOUND,
)
А для urls.py
:
path(
route='comments/<str:username>/',
view=views.ListSpecificUserCommentsApiView.as_view(),
name='user-comments',
),