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