Vous devez utiliser des API sendfile fournies par des serveurs populaires comme apache
ou 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 python
fournisseur utilise django FileResponse
s'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
fileprovider
application aux INSTALLED_APPS
paramètres,
- ajouter
fileprovider.middleware.FileProviderMiddleware
aux MIDDLEWARE_CLASSES
paramètres
- définissez les
FILEPROVIDER_NAME
paramètres sur nginx
ou apache
en production, par défaut, c'est python
à des fins de développement.
dans vos vues de classe ou de fonction, définissez la X-File
valeur 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 nginx
une 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