Wenn du ein eigenes Dateispeichersystem benötigst – zum Beispiel falls Dateien auf einen anderen Rechner ausgelagert werden sollen – so kannst du das durch eine eigene Storage-Klasse erreichen. Hierfür musst du folgende Schritte durchführen:
Deine Storage-Klasse muss eine Subklasse von django.core.files.storage.Storage sein:
from django.core.files.storage import Storage
class MyStorage(Storage):
...
Django muss in der Lage sein, dein Speicherungssystem ohne Argumente initialisieren zu können. Folglich sollten sämtliche Einstellung aus django.conf.settings bezogen werden:
from django.conf import settings
from django.core.files.storage import Storage
class MyStorage(Storage):
def __init__(self, option=None):
if not option:
option = settings.CUSTOM_STORAGE_OPTIONS
...
Deine Storage-Klasse muss die Methoden _open() und _save() sowie alle anderen für sie relevanten Methoden implementieren. Im Anschluss findest du eine Liste dieser Methoden.
Zusätzlich muss deine Klasse die path()-Methode überschreiben, falls sie die Dateien lokal speichert.
Dein Storage-System kann jede der in ref-files-storage behandelten Methode überschreiben. Sie muss jedoch immer die Folgenden implementieren:
Normalerweise solltest du auch die Hooks verwenden, die für Storage-Objekte existieren:
Verpflichtend
Wird von Storage.open() aufgerufen. Hierbei wird das eigentliche Öffnen einer Datei implementiert. Die Methode muss ein File zurückgeben, wobei du in den meisten Fällen eher eine Subklasse verwenden wirst, die noch entsprechende Applikationslogik für dein Speichersystem mitbringt.
Wird von Storage.save() aufgerufen. Der name wurde bereits durch get_valid_name() und get_available_name() behandelt und content ist das entsprechende File-Objekt. Rückgabewert wird keiner erwartet.
Gibt einen Dateinamen zurück, der für das Speicherungssystem geeignet ist. name ist der Originalname, der an den Server gesendet wurde, nachdem sämtliche Pfadinformationen entfernt wurden. Überschreibe diese Methode, wenn du zum Beispiel bestimmte Zeichen konvertieren muss, um sichere Dateinamen zu erhalten.
Die Implementierung in Storage entfernt sämtliche Zeichen, die weder alphanumerische Zeichen, noch Punkte, noch Unterstriche sind.
Gibt einen Dateinamen zurück der im Speichersystem verfügbar ist. Abhängig von der Implementierung wird hierbei auch der übergebene Dateiname berücksichtigt. Das name-Argument, das hier übergeben wird, wurde bereits durch get_valid_name() gefiltert.
Die Implementierung in Storage fügt einfach so lange Unterstriche an den Dateinamen an, bis ein noch nicht verwendeter Name im Zielverzeichnis gefunden wird.
Mar 01, 2010