Add custom media file serving view for production mode
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
2025-11-08 20:55:20 +09:00
parent b1bcd85644
commit 091362d81e

View File

@@ -0,0 +1,40 @@
import os
import mimetypes
from django.http import HttpResponse, Http404
from django.conf import settings
from django.views.generic import View
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_control
@method_decorator(cache_control(max_age=31536000), name='dispatch')
class MediaFileView(View):
"""
Обслуживание медиа файлов в production режиме.
"""
def get(self, request, file_path):
# Полный путь к файлу
full_path = os.path.join(settings.MEDIA_ROOT, file_path)
# Проверка безопасности - файл должен находиться в MEDIA_ROOT
if not os.path.abspath(full_path).startswith(os.path.abspath(settings.MEDIA_ROOT)):
raise Http404("Файл не найден")
# Проверка существования файла
if not os.path.exists(full_path) or not os.path.isfile(full_path):
raise Http404("Файл не найден")
# Определение MIME типа
content_type, _ = mimetypes.guess_type(full_path)
if content_type is None:
content_type = 'application/octet-stream'
# Чтение файла и возврат ответа
try:
with open(full_path, 'rb') as f:
response = HttpResponse(f.read(), content_type=content_type)
response['Content-Length'] = os.path.getsize(full_path)
return response
except Exception:
raise Http404("Ошибка чтения файла")