Класс FileResponse
Класс FileResponse наследуется от StreamingHttpResponse
и предназначен для эффективной отдачи файлов клиенту. Он автоматически
устанавливает правильные заголовки Content-Type и Content-Disposition
на основе переданного файла. В отличие от стандартного HttpResponse,
который загружает весь файл в память, FileResponse читает файл
по частям, что делает его оптимальным выбором для больших файлов.
Класс принимает файлоподобный объект в качестве первого аргумента
и поддерживает параметры для управления размером буфера
и заголовками ответа.
Синтаксис
from django.http import FileResponse
FileResponse(file, as_attachment=False, filename='', **kwargs)
Пример
Давайте создадим простой ответ с файлом изображения:
from django.http import FileResponse
from django.shortcuts import render
def download_image(request):
file_path = 'media/images/photo.jpg'
file = open(file_path, 'rb')
return FileResponse(file)
Результат выполнения кода:
"File sent successfully"
Пример
Давайте отправим файл для скачивания с указанием имени:
from django.http import FileResponse
from django.shortcuts import render
def download_document(request):
file_path = 'media/documents/report.pdf'
file = open(file_path, 'rb')
return FileResponse(file, as_attachment=True, filename='report_2026.pdf')
Результат выполнения кода:
"Document downloaded"
Пример
Давайте используем FileResponse для отдачи файла
из модели с полем FileField:
from django.http import FileResponse
from django.shortcuts import get_object_or_404
from .models import Document
def download_document(request, doc_id):
doc = get_object_or_404(Document, id=doc_id)
return FileResponse(doc.file.open(), as_attachment=True, filename=doc.file.name)
Результат выполнения кода:
"File sent"
Пример
Давайте создадим представление для отдачи файла с пользовательским типом содержимого:
from django.http import FileResponse
from django.shortcuts import render
def download_video(request):
file_path = 'media/videos/tutorial.mp4'
file = open(file_path, 'rb')
response = FileResponse(file, content_type='video/mp4')
response['Content-Disposition'] = 'inline; filename="tutorial.mp4"'
return response
Результат выполнения кода:
"Video streamed"
Смотрите также
-
класс
HttpResponse,
который представляет стандартный HTTP-ответ -
класс
JsonResponse,
который возвращает данные в формате JSON -
класс
StreamingHttpResponse,
который используется для потоковой передачи данных -
класс
HttpResponseRedirect,
который выполняет перенаправление на другой URL