Как отправить видео (mp4) в качестве ответа
Мне нужно знать, как я могу отправить видеофайл в качестве ответа в django.
React+Django
это мой код на django, который обрабатывает запрос.
u/csrf_exempt
def get_video(request):
view_logger.info("Fetching video")
try:
if not LOGS_FOLDER_PATH:
view_logger.warning("LOGS FOLDER PATH not present")
return HttpResponseNotFound("Logs folder path not set.")
videos_path = os.path.join(LOGS_FOLDER_PATH, "videos")
if not os.path.exists(videos_path):
return HttpResponseNotFound("Videos folder does not exist.")
videos_list = os.listdir(videos_path)
if not videos_list:
return HttpResponseNotFound("No videos found.")
video_path = os.path.join(videos_path, videos_list[0])
view_logger.info(f"Video path:- {video_path}")
video_response = FileResponse(
open(video_path, 'rb'),
)
view_logger.info(f"\n\n\n{video_response}")
return video_response
except Exception as error:
view_logger.error(f"Error fetching terminal video. Error: {error}")
return JsonResponse({'error': 'Internal server error'}, status=500)
LOGS_FOLDER_PATH - я не могу добавить это как статическое, потому что получаю это во время выполнения.
Код реакции:-
import React from "react";
import "./CSS/VideoDisplay.css";
const VideoDisplay = ({ api_url_name }) => {
return (
<div className="video-display-div">
<video width="100%" controls aria-label="video">
<source src={`${api_url_name}/api/dashboard/get-video/`} type="video/mp4" />
Your browser does not support the video tag.
</video>
</div>
);
};
export default VideoDisplay;
Я попытался вернуть видео в качестве ответа, используя файл ответа, но видео не отображает интерфейс.
Вы очень близки к истине — серверная часть корректно возвращает файл с помощью FileResponse, но чтобы сделать видеопоток воспроизводимым в браузере (особенно через тег), необходимо выполнить несколько ключевых условий:
Установите правильный тип содержимого
Убедитесь, что в ответе файла указан правильный MIME-тип для видео. Для файла .mp4 это должно быть:
from django.http import FileResponse, HttpResponseNotFound, JsonResponse
from django.views.decorators.csrf import csrf_exempt
import os
@csrf_exempt
def get_video(request):
view_logger.info("Fetching video")
try:
if not LOGS_FOLDER_PATH:
view_logger.warning("LOGS FOLDER PATH not present")
return HttpResponseNotFound("Logs folder path not set.")
videos_path = os.path.join(LOGS_FOLDER_PATH, "videos")
if not os.path.exists(videos_path):
return HttpResponseNotFound("Videos folder does not exist.")
videos_list = os.listdir(videos_path)
if not videos_list:
return HttpResponseNotFound("No videos found.")
video_path = os.path.join(videos_path, videos_list[0])
view_logger.info(f"Video path:- {video_path}")
# Ensure the correct content type
return FileResponse(open(video_path, 'rb'), content_type='video/mp4')
except Exception as error:
view_logger.error(f"Error fetching terminal video. Error: {error}")
return JsonResponse({'error': 'Internal server error'}, status=500)
Выяснил, в чем проблема, размер видеофайла был мал для его воспроизведения с помощью видеоплеера. Проверил с большим размером видеофайла, это сработало.
You better provide MIME type by requesting the video type from the API response header instead of hardcoding it to video/mp4
since there are ogg, mpeg, quicktime, etc videos.
You can use mimetypes module to obtain it like:
import mimetypes
video_path = "path/to/video"
content_type = mimetypes.guess_type(video_path)[0]
return FileResponse(open(video_path, 'rb'), content_type=content_type)