Sie sollten sendfile apis verwenden, die von gängigen Servern wie apache
oder 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 python
Anbieter DjangoFileResponse
falls verfügbar, und Unterstützung für viele Serverimplementierungen von lighthttp, caddy bis hiawatha
Verwendung
pip install django-fileprovider
fileprovider
App hinzufügen zuINSTALLED_APPS
Einstellungen ,
- hinzufügen
fileprovider.middleware.FileProviderMiddleware
zuMIDDLEWARE_CLASSES
Einstellungen
FILEPROVIDER_NAME
Einstellungen auf nginx
oder apache
in der Produktion einstellen , standardmäßig python
für Entwicklungszwecke.
Setzen Sie in Ihren Klassen- oder Funktionsansichten den Antwortheaderwert X-File
auf 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 nginx
eine 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