Você deve usar apis sendfile fornecidas por servidores populares como apache
ou 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 python
provedor usa django, FileResponse
se disponível, e também adiciona suporte para muitas implementações de servidor, desde lighthttp, caddy a hiawatha
Uso
pip install django-fileprovider
- adicionar
fileprovider
aplicativo às INSTALLED_APPS
configurações,
- adicionar
fileprovider.middleware.FileProviderMiddleware
às MIDDLEWARE_CLASSES
configurações
- definir
FILEPROVIDER_NAME
configurações para nginx
ou apache
em produção; por padrão, é python
para fins de desenvolvimento.
nas visualizações de função ou baseada em classe, defina o X-File
valor 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 nginx
define 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