Debe usar las apis sendfile proporcionadas por servidores populares como apacheo nginx
en producción. Muchos años estuve usando sendfile api de estos servidores para proteger archivos. Luego creó una aplicación django basada en middleware simple para este propósito, adecuada tanto para el desarrollo como para la producción. Puede acceder al código fuente aquí .
ACTUALIZACIÓN: en la nueva versión, el pythonproveedor usa django FileResponsesi está disponible y también agrega soporte para muchas implementaciones de servidor desde lighthttp, caddy hasta hiawatha
Uso
pip install django-fileprovider
- agregar
fileprovideraplicación a la INSTALLED_APPSconfiguración,
- agregar
fileprovider.middleware.FileProviderMiddlewarea la MIDDLEWARE_CLASSESconfiguración
- establecer
FILEPROVIDER_NAMEconfiguraciones en nginxo apacheen producción, por defecto es pythonpara fines de desarrollo.
en sus vistas de clase o función establezca el X-Filevalor del encabezado de respuesta en la ruta absoluta al archivo. Por ejemplo,
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 Se ha implementado de manera tal que su código solo necesitará una modificación mínima.
Configuración de Nginx
Para proteger el archivo del acceso directo, puede establecer la configuración como
location /files/ {
internal;
root /home/sideffect0/secret_files/;
}
Aquí nginxestablece una dirección URL de /files/acceso solo internamente, si está utilizando la configuración anterior, puede configurar X-File como,
response['X-File'] = '/files/filename.extension'
Al hacer esto con la configuración nginx, el archivo estará protegido y también puede controlar el archivo desde django views