Я не эксперт по Django, но я думаю, что этого нельзя достичь исключительно в Django.После того как ваш запрос был выполнен в Django, то есть вы успешно сгенерировали ссылку для загрузки для своего пользователя, вы не можете вернуться через 60 минут и сделать ее недействительной.Не чистым Django (исправьте меня!).
Другая причина блокировки заключается в том, что Django просто не предназначен для обслуживания файлов.Файлы (статические и мультимедийные) предназначены для обслуживания веб-сервером, установленным перед Django (apache / nginx / etc ...).Например, файл, сохраненный Django, может быть доступен по следующей ссылке: https://my-django-app.venom.com/media/my_file.jpg
Проблема здесь в том, что местоположение вашего файла легко угадать.Чтобы было сложнее угадать, вы должны поместить его в папку с длинной случайной строкой, например: https://my-django-app.venom.com/media/b926yqagf6qrzpyew7h3kghtejayxp/my_file.jpg
.
Чтобы достичь такой функциональности, я вижу два пути (может быть десяткидругие альтернативы, но эти два сразу же приходят мне в голову):
Создание и удаление случайного пути
Чтобы сделать путь недействительным через 60 минут, вам придется выполнить следующие действия впорядок для каждого запроса файла:
- Генерирование случайной строки
- Создание папки с использованием сгенерированной случайной строки в качестве имени
- Скопируйте файл, который будет обслуживаться в этомпапка (оригинальная версия файла должна храниться за пределами вашей папки
MEDIA
для большей безопасности - . Предоставьте пользователю ссылку для генерации
- . Зарегистрируйте этот URL-адрес где-нибудь и установите для него дату истечения срока действия.Например, через 60 минут после генерации (я бы создал для этого простую модель и сохранил бы ее в SQL)
- Запуск задания каждую минуту для сохраненных URL-адресов, и если срок его действия истек,удалите его папку из файловой системы
Чтобы выполнить 6-й шаг, вам нужно расширить приложение Django с помощью Celery.Используя Celery, вы можете легко планировать работу (Google для celery-beat
).Это задание будет выполняться каждую минуту (или что вам нравится), запрашивать сохраненные URL за текущим временем и удалять папку случайных строк и ее содержимое из папки MEDIA
в файловой системе.Celery очень прост, есть десятки хороших примеров, доступных онлайн.
Управление устаревшими ссылками за пределами Django с помощью сервера хранения объектов
Управлять просроченными ссылками на уровне инфраструктуры очень просто, сохраняяпользователь загружал содержимое в хранилище объектов, например, minio.Minio очень похож на Amazon S3, но с открытым исходным кодом и может быть размещен в вашем собственном помещении.Minio может генерировать ссылки для сохраненных файлов, и вы можете установить срок действия от 1 минуты до 1 недели.В Django все, что вам нужно сделать, это запросить ссылку на Minio и указать срок действия.Остальным управляет minio.
Для реализации этого подхода вам необходимо расширить API хранилища файлов Django (https://docs.djangoproject.com/en/2.1/ref/files/storage/) и использовать один из клиентов minio, написанных для Django. Я рекомендую django-minio-storage (https://github.com/py-pa/django-minio-storage).
Если вы выберете этот метод, вы можете полностью отделить Django от загруженного пользователем содержимого и перестать полагаться на файлы, обслуживающие ваш веб-сервер, из папки Django MEDIA
.
Удачи!
Обновление:
Вот моя реализация хранилища minio в Django 2.x на основе пакета django-minio-storage
. Я создал это относительно давно, и этоможет быть полон плохих практик и хакерских решений. Не стесняйтесь использовать его как справочную работу: https://gist.github.com/theriverman/db9025a22e0f3c40810bed5f12a139d8