Google Cloud Stoarge unter Verwendung der Django-Bibliothek django-storages Ich habe die Methode zum Löschen von Dateien durch Ausprobieren gelöst, daher werde ich das Memo einschließlich der Upload-Methode zusammenfassen.
Auf der Seite django-storages werden die Grundeinstellungen beschrieben.
settings.py
DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'
GS_BUCKET_NAME = 'YOUR_BUCKET_NAME_GOES_HERE'
Wann,
settings.py
from google.oauth2 import service_account
GS_CREDENTIALS = service_account.Credentials.from_service_account_file(
"path/to/credentials.json"
)
Wenn Sie die beiden Punkte beschreiben und das Modell wie gewohnt definieren, funktioniert es beim Hochladen. Das Folgende ist ein Beispiel für ein Bilddateimodell.
models.py
class Image(models.Model):
image = models.ImageField(upload_to='image/')
def __str__(self):
return self.image.name
Bis zu diesem Zeitpunkt wird die Google Cloud Storage-Datei jedoch nicht gelöscht, selbst wenn Sie den Datensatz löschen. Es scheint, dass (ich habe gerade die sekundären Informationen gelesen) das Designkonzept von Django selbst darin besteht, das Löschen von Dateien selbst zu implementieren, nicht nur bei Verwendung von Google Cloud Storage.
Um es zu implementieren, müssen Sie einen Dekorator verwenden, um die Funktion zu definieren, die beim Löschen von Datensätzen aufgerufen wird. Wenn Sie eine Datei mit der Google Cloud-Konsole löschen (wenn sich während dieses Vorgangs keine Datei auf der Seite des Google Cloud-Speichers befindet), tritt ein Fehler auf, sodass die Ausnahmeverarbeitung eingeschlossen ist.
models.py
from django.dispatch import receiver
from google.cloud import exceptions
@receiver(models.signals.post_delete, sender=Image)
def auto_delete_image(sender, instance, **kargs):
file = instance.image
try:
file.storage.delete(name=file.name)
except exceptions.NotFound as e:
print(e)
Wenn die Umgebungsvariable "GOOGLE_APPLICATION_CREDENTIALS" festgelegt ist, kann sie auch wie folgt im google.cloud-Modul implementiert werden. In diesem Fall ist jedoch ein Fehler aufgetreten, es sei denn, "storage.buckets.get" wurde als Berechtigung von Google Cloud zugewiesen.
model.py
from google.cloud import storage
from django.conf import settings
@receiver(models.signals.post_delete, sender=Image)
def auto_delete_image(sender, instance, **kargs):
storage_client = storage.Client()
bucket = storage_client.get_bucket(settings.GS_BUCKET_NAME)
blob = bucket.blob(instance.image.name)
try:
blob.delete()
except exceptions.NotFound as e:
print(e)
Ich werde die Einstellungen auf der Google Cloud Storage-Seite ergänzen. Ich habe es nicht gut überprüft, daher benötige ich möglicherweise nicht alle, aber in meiner Umgebung stelle ich ein Dienstkonto mit den folgenden Berechtigungen aus.
Der offizielle Link enthält die tatsächliche Einstellungsmethode.
Recommended Posts