Sie sollten sendfile apis verwenden, die von gängigen Servern wie apacheoder nginx
in der Produktion bereitgestellt werden . Viele Jahre lang habe ich die sendfile-API dieser Server zum Schutz von Dateien verwendet. Anschließend wurde eine einfache Middleware-basierte Django-App für diesen Zweck erstellt, die sowohl für Entwicklungs- als auch für Produktionszwecke geeignet ist . Hier können Sie auf den Quellcode zugreifen .
UPDATE: In der neuen Version verwendet der pythonAnbieter DjangoFileResponse falls verfügbar, und Unterstützung für viele Serverimplementierungen von lighthttp, caddy bis hiawatha
Verwendung
pip install django-fileprovider
fileproviderApp hinzufügen zuINSTALLED_APPS Einstellungen ,
- hinzufügen
fileprovider.middleware.FileProviderMiddlewarezuMIDDLEWARE_CLASSES Einstellungen
FILEPROVIDER_NAMEEinstellungen auf nginxoder apachein der Produktion einstellen , standardmäßig pythonfür Entwicklungszwecke.
Setzen Sie in Ihren Klassen- oder Funktionsansichten den Antwortheaderwert X-Fileauf den absoluten Pfad zur Datei. Beispielsweise,
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 so implementiert, dass Ihr Code nur minimal geändert werden muss.
Nginx-Konfiguration
Um die Datei vor direktem Zugriff zu schützen, können Sie die Konfiguration als festlegen
location /files/ {
internal;
root /home/sideffect0/secret_files/;
}
Hier wird nginxeine Standort-URL festgelegt, auf die /files/nur intern zugegriffen werden kann. Wenn Sie die obige Konfiguration verwenden, können Sie X-File wie folgt festlegen:
response['X-File'] = '/files/filename.extension'
Wenn Sie dies mit der Nginx-Konfiguration tun, wird die Datei geschützt und Sie können die Datei auch von Django aus steuern views