Консоль Django выдает ошибку not found для api, хотя он виден в браузере
У меня есть настройка бэкенда на django. В ней у меня есть несколько папок: base (приложение, в котором хранятся мои модели), папка api, в которой есть views.py
и urls.py
для моих apis, и папка backend (базовая папка djangos, в которой находятся settings.py
, wsgi.py
и т.д.).
Теперь, у меня уже есть несколько API в моем views.py (в папке api), которые связаны и работают, и я только что попытался создать новый. Хотя я проделал те же шаги, выполнил ту же привязку, этот API не работает при обращении к нему из фронтенда, в консоли написано:
Not Found: /api/getmodel/
\[25/Mar/2024 22:36:50\] "GET /api/getmodel/ HTTP/1.1" 404 3116"
Когда я перехожу по ссылке http://127.0.0.1:8000/api/getmodel/
, я вижу стандартное представление djangorestframework, поэтому я знаю, что представление существует и по этой ссылке действительно что-то есть. Вот соответствующие файлы:
urls.py
(в папке api):
from django.urls import path
from . import views
from rest_framework_simplejwt.views import (
TokenRefreshView,
)
from .views import MyTokenObtainPairView
urlpatterns = [
path('registeruser/', views.register_user),
path('token/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path('createmodel/', views.create_model),
path('getmodel/', views.fetch_model),
]
views.py
(в папке api):
from rest_framework.response import Response
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from django.contrib.auth.hashers import make_password
from base.models import User, HumanModel
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
from django.http import JsonResponse
import subprocess
import os
#login tokenizer (working fine)
#login api here (working fine)
#example of working API
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def create_model(request):
data = request.data
username = request.user.username
print(username)
print(data)
#do a whole bunch of processing (left out for simplicity)
#api that is NOT working (saying not found)
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def fetch_model(request):
try:
# Attempt to fetch the HumanModel instance associated with the current user
human_model = HumanModel.objects.get(user=request.user)
# Check if a model_path exists
if human_model.model_path:
# Return the model_path if it exists
return Response({'model_path': human_model.model_path})
else:
# Return a message indicating the model_path is not available
return Response({'message': 'No model path exists for the current user.'})
except HumanModel.DoesNotExist:
# Return a response indicating no HumanModel instance exists for the current user
return Response({'message': 'No model information found for the current user.'}, status=404)
У меня уже есть urls.py в папке базового бэкенда, который работает правильно, и он работает с другими моими apis, поэтому я не могу понять, в чем проблема. Вот файл для справки:
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path("admin/", admin.site.urls),
path("api/", include('api.urls'))
]
Я не думаю, что это проблема конфигурации в привязке моей папки api к urls.py
в папке backend, так как другие api (login, register, createmodel) все работают. И опять же, я могу перейти по адресу http://127.0.0.1:8000/api/getmodel/
и увидеть стандартное представление djangorestframework, но когда мой фронтенд-код пытается с помощью axios перейти по этому url, в консоли DJANGO появляется сообщение "не найдено". Есть идеи?
Смотрите выше для объяснения, даже если представление видно в браузере, оно говорит, что не найдено в консоли. Я правильно настроил прокси в моем react frontend в package.json
, мои другие apis работают. Вот как я получаю данные из моего фронтенда:
useEffect(() => {
const fetchModelPath = async () => {
if (!authTokens) return; // If there are no auth tokens, return early
try {
const response = await axios.get('/api/getmodel/', {
headers: {
Authorization: `Bearer ${authTokens.access}`,
},
});
if (response.data.model_path) {
setModelPath(response.data.model_path);
} else {
setModelPath("create");
}
} catch (error) {
console.error("There was an error fetching the model path", error);
setModelPath("create");
}
};
fetchModelPath();
}, [authTokens]);
Ваш фронтенд может сначала попробовать HEADs запросы, прежде чем сделать Get запрос.
Проверьте свою конечную точку с помощью curl, postman или других инструментов разработки api.
Если ваш бэкэнд отвечает 200, попробуйте добавить HEAD
в декоратор @api_view
.
@api_view(['HEAD', 'GET'])
@permission_classes([IsAuthenticated])
def fetch_model(request):
# rest of your code