Вы должны использовать 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