Google Cloud Stoarge en utilisant la bibliothèque de Django django-storages J'ai résolu la méthode de suppression de fichier par essais et erreurs, je vais donc résumer le mémo, y compris la méthode de téléchargement.
La page django-storages décrit les paramètres de base.
settings.py
DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'
GS_BUCKET_NAME = 'YOUR_BUCKET_NAME_GOES_HERE'
Quand,
settings.py
from google.oauth2 import service_account
GS_CREDENTIALS = service_account.Credentials.from_service_account_file(
"path/to/credentials.json"
)
Si vous décrivez les deux points et définissez le modèle comme d'habitude, il fonctionnera pour le téléchargement. Voici un exemple de modèle de fichier image.
models.py
class Image(models.Model):
image = models.ImageField(upload_to='image/')
def __str__(self):
return self.image.name
Cependant, jusqu'à présent, même si vous supprimez l'enregistrement, le fichier Google Cloud Storage ne sera pas supprimé. Il semble que (je viens de lire les informations secondaires) le concept de conception de Django lui-même consiste à implémenter la suppression de fichiers par moi-même, pas seulement lors de l'utilisation de Google Cloud Storage.
Pour l'implémenter, vous devez utiliser un décorateur pour définir la fonction qui sera appelée lors de la suppression des enregistrements. Si vous supprimez un fichier avec Google Cloud Console (lorsqu'il n'y a pas de fichier du côté de Google Cloud Storage pendant ce processus), une erreur se produit, le traitement des exceptions est donc inclus.
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)
Si la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS
est définie, elle peut également être implémentée dans le module google.cloud comme suit.
Cependant, dans ce cas, une erreur s'est produite à moins que storage.buckets.get
n'ait été attribué en tant qu'autorité de google cloud.
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)
Je compléterai les paramètres côté Google Cloud Storage. Je ne l'ai pas bien vérifié, donc je n'ai peut-être pas besoin de tout, mais dans mon environnement, j'émets un compte de service avec les autorisations suivantes.
Le lien officiel est affiché pour la méthode de réglage réelle.
Recommended Posts