Vous devez utiliser des API sendfile fournies par des serveurs populaires comme apacheou nginx
en production. De nombreuses années, j'utilisais l'API Sendfile de ces serveurs pour protéger les fichiers. Vous avez ensuite créé une application Django basée sur un middleware simple à cet effet, adaptée à la fois au développement et à la production.Vous pouvez accéder au code source ici .
MISE À JOUR: dans la nouvelle version, le pythonfournisseur utilise django FileResponses'il est disponible et ajoute également la prise en charge de nombreuses implémentations de serveur de lighthttp, caddy à hiawatha
Usage
pip install django-fileprovider
- ajouter une
fileproviderapplication aux INSTALLED_APPSparamètres,
- ajouter
fileprovider.middleware.FileProviderMiddlewareaux MIDDLEWARE_CLASSESparamètres
- définissez les
FILEPROVIDER_NAMEparamètres sur nginxou apacheen production, par défaut, c'est pythonà des fins de développement.
dans vos vues de classe ou de fonction, définissez la X-Filevaleur de l'en- tête de réponse sur le chemin absolu du fichier. Par exemple,
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 mis en œuvre de manière à ce que votre code ne nécessite qu'une modification minimale.
Configuration de Nginx
Pour protéger le fichier d'un accès direct, vous pouvez définir la configuration comme
location /files/ {
internal;
root /home/sideffect0/secret_files/;
}
Définit ici nginxune URL d'emplacement /files/uniquement pour l'accès interne, si vous utilisez la configuration ci-dessus, vous pouvez définir X-File comme,
response['X-File'] = '/files/filename.extension'
En faisant cela avec la configuration nginx, le fichier sera protégé et vous pouvez également contrôler le fichier à partir de django views