Отправка видео в качестве ответа в django

Как отправить видеофайл mp4 в качестве ответа в django? Я не хочу вставлять в видео или объектные теги html, но хочу отправить сам mp4. Кто-нибудь может помочь с этой проблемой?


person Jay    schedule 08.05.2012    source источник


Ответы (1)


Как правило, вы не хотите этого делать; лучше перенаправить на сервер, отличный от Django, на обслуживать статические файлы, например. django.shortcuts.redirect -- будет быстрее, больше памяти- эффективным и, вероятно, более безопасным. Но, конечно, иногда это не удобно. Это должно работать:

from wsgiref.util import FileWrapper

file = FileWrapper(open('path/to/video.mp4', 'rb'))
response = HttpResponse(file, content_type='video/mp4')
response['Content-Disposition'] = 'attachment; filename=my_video.mp4'
return response

FileWrapper (документы) используется, поэтому слишком много данных не отправляется сразу, поскольку файловые объекты Python повторяют строку за раз, а символы \n, по-видимому, не особенно распространены в mp4. (Отправка слишком большого количества данных означает, что веб-сервер не может отправить файл, поскольку он считывается с жесткого диска, а вместо этого должен ждать длинных неудобных интервалов приращения.)

Обратите внимание: хотя я нигде не вижу этого в документации, файл закрывается по завершении.

person Danica    schedule 08.05.2012
comment
Спасибо, Дугал, все работает, но я загружаю его, когда я нажимаю URL-адрес в браузере. Я не хочу этого, я хочу, чтобы mp4 воспроизводился в самом браузере. Кроме того, это небольшой видеофайл размером около 10 МБ, поэтому я не хочу использовать какой-либо другой сервер, отличный от Django. - person Jay; 09.05.2012
comment
Попробуйте удалить строку Content-Disposition, это может помочь. Но если это производственный сайт, вы уже должны обслуживать свой CSS, изображения и т. Д. В любом случае за пределами Django.... - person Danica; 09.05.2012
comment
Я попытался удалить строку Content-Disposition, я получаю сообщение об ошибке с именем error: [Errno 32] Broken pipe - person Jay; 11.05.2012
comment
Происходит ли это воспроизводимо, когда строка content-disposition закомментирована, а когда нет? Похоже на проблему, которая просто сервер разработки может делать только одну вещь за раз. - person Danica; 11.05.2012