Você deve usar apis sendfile fornecidas por servidores populares como apacheou nginx
em produção. Muitos anos eu estava usando a API sendfile desses servidores para proteger arquivos. Em seguida, criou um aplicativo django baseado em middleware simples para esse fim, adequado tanto para fins de desenvolvimento quanto de produção. Você pode acessar o código-fonte aqui .
UPDATE: na nova versão, o pythonprovedor usa django, FileResponsese disponível, e também adiciona suporte para muitas implementações de servidor, desde lighthttp, caddy a hiawatha
Uso
pip install django-fileprovider
- adicionar
fileprovideraplicativo às INSTALLED_APPSconfigurações,
- adicionar
fileprovider.middleware.FileProviderMiddlewareàs MIDDLEWARE_CLASSESconfigurações
- definir
FILEPROVIDER_NAMEconfigurações para nginxou apacheem produção; por padrão, é pythonpara fins de desenvolvimento.
nas visualizações de função ou baseada em classe, defina o X-Filevalor do cabeçalho de resposta como caminho absoluto para o arquivo. Por exemplo,
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 incrementado de uma maneira que seu código precisará apenas de modificações mínimas.
Configuração Nginx
Para proteger o arquivo do acesso direto, você pode definir a configuração como
location /files/ {
internal;
root /home/sideffect0/secret_files/;
}
Aqui nginxdefine um URL de localização que /files/somente acessa internamente. Se você estiver usando a configuração acima, poderá definir o arquivo X como,
response['X-File'] = '/files/filename.extension'
Ao fazer isso com a configuração nginx, o arquivo será protegido e você também poderá controlar o arquivo do django views