Как отправить видео (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)
Вернуться на верх