Files
links/backend/backend/media_views.py
Andrey K. Choi 091362d81e
Some checks failed
continuous-integration/drone/push Build is failing
Add custom media file serving view for production mode
2025-11-08 20:55:20 +09:00

40 lines
1.6 KiB
Python

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("Ошибка чтения файла")