Вы должны использовать apis sendfile, предоставляемые популярными серверами, такими как apache
или nginx
в производстве. Много лет я использовал sendfile api этих серверов для защиты файлов. Затем для этой цели было создано простое приложение django на основе промежуточного программного обеспечения, подходящее как для разработки, так и для производства. Вы можете получить доступ к исходному коду здесь .
ОБНОВЛЕНИЕ: в новой версии python
провайдер использует django, FileResponse
если доступно, а также добавляет поддержку многих реализаций сервера от lighthttp, caddy до hiawatha
использование
pip install django-fileprovider
- добавить
fileprovider
приложение в INSTALLED_APPS
настройки,
- добавить
fileprovider.middleware.FileProviderMiddleware
в MIDDLEWARE_CLASSES
настройки
- установить
FILEPROVIDER_NAME
настройки на nginx
или apache
в производстве, по умолчанию это python
для целей разработки.
в ваших представлениях классов или функций установите X-File
значение заголовка ответа в виде абсолютного пути к файлу. Например,
def hello(request):
// code to check or protect the file from unauthorized access
response = HttpResponse()
response['X-File'] = '/absolute/path/to/file'
return response
django-fileprovider
таким образом, что ваш код будет нуждаться только в минимальной модификации.
Конфигурация Nginx
Чтобы защитить файл от прямого доступа, вы можете установить конфигурацию как
location /files/ {
internal;
root /home/sideffect0/secret_files/;
}
Здесь nginx
задает адрес URL /files/
только для внутреннего доступа, если вы используете вышеуказанную конфигурацию, вы можете установить X-File как,
response['X-File'] = '/files/filename.extension'
Делая это с конфигурацией nginx, файл будет защищен, а также вы можете управлять файлом из django views