Пытаюсь отправить базовую строку в серверную часть Django с помощью POST-запроса с использованием axios, но данные не отправляются
Я пытался передать базовую строку в серверную часть Django из интерфейса, используя вызов axios.post.
Соединение обеспечено, и серверная часть обнаруживает запрос, но данные пусты.
Внешняя сторона:
const axios = Axios.create({
baseURL: API_URL,
headers: {
'Content-Type': 'application/json',
},
});
export class MessageService {
static async sendMessage(message: string): Promise<any> {
try {
const data = {question: message}
// Uncomment the line below to use the actual API call
const response = await axios.post('/chatbot/rest_handler', data);
return response;
} catch (error) {
console.error('Error sending message:', error);
throw error;
}
}
Серверная часть:
@csrf_exempt
def rest_handler(request):
print("REQUEST IS SENT FROM FRONTEND")
req_data = request.body
q_info = req_data.decode("utf-8")
print("QUESTION:"+ q_info)
return JsonResponse(request)
Но на экране вывода я вижу пустую строку:
[09/Jun/2025 10:49:33] "OPTIONS /chatbot/rest_handler HTTP/1.1" 200 2
REQUEST IS SENT FROM FRONTEND
QUESTION:
request.body на самом деле пусто в запросе, который получает ваше представление, но этот запрос , а не, является POST ты думаешь, что это так.
То, что вы печатаете, - это предварительная запись CORS в браузере:
[09/Jun/2025 10:49:33] "OPTIONS /chatbot/rest_handler HTTP/1.1" 200 2
Почему вы видите только пустое тело
Предполетная подготовка = ОПЦИИ
Когда ваш интерфейс React/Vite/Next/etc. обслуживается из другого источника/порта, отличного от Django, браузер сначала отправляет запросOPTIONS, чтобы проверить, разрешен ли реальный запрос. На предварительном рейсе никогда не перевозят тело, так чтоrequest.bodyэтоb''.Настоящая ПОЧТА никогда не запускается
Поскольку Django не отвечает на предварительный запрос требуемыми заголовками CORS, браузер никогда не выводитPOST. Таким образом, ваш view никогда не увидит полезную нагрузку в формате JSON.
Исправляю это
Добавить правильную обработку CORS
Самый простой и надежный способ - это установить django-cors-headers:
pip install django-cors-headers
# settings.py
INSTALLED_APPS = [
...
'corsheaders',
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # must be high in the list
...
]
CORS_ALLOWED_ORIGINS = [
"http://localhost:5173", # your Vite/React dev server
"https://your-frontend.example",
]
# If you want to allow credentials (cookies) add:
# CORS_ALLOW_CREDENTIALS = True
Промежуточное программное обеспечение автоматически:
Реагирует на предполетное сообщение
OPTIONSзаголовкамиAccess-Control-AllowПозволяет браузеру отправлять реальный
POST, содержащий ваше тело в формате JSON.
Обрабатывайте только сообщение в вашем представлении
@csrf_exempt
def rest_handler(request):
if request.method == "OPTIONS":
return HttpResponse(status=200)
elif request.method == "POST":
print("REQUEST IS SENT FROM FRONTEND")
req_data = request.body
q_info = req_data.decode("utf-8")
print("QUESTION:"+ q_info)
return JsonResponse(request)
Итак, в этом случае вы просто отвечаете 200, когда получаете OPTIONS ответ, а затем пытаетесь поймать POST ответ, который должен содержать ваши данные.