GAE & GCS & Django avec URL d'image vide

Aperçu

Une note qui est devenue folle lorsque j'ai transféré l'infrastructure exécutant Django de GKE vers GAE

J'ai utilisé un module appelé django-storages pour télécharger sur GCS et obtenir l'URL via imageField. https://django-storages.readthedocs.io/en/latest/backends/gcloud.html?highlight=GS_DEFAULT_ACL#settings

Cependant, lorsque je suis passé à GAE, imageField est revenu vide. le téléchargement fonctionne, et lors de l'exécution de Django sur localhost ou GKE, cela fonctionne.

Conclusion

Si vous n'avez pas besoin de la période de validité de l'URL Tout ce que vous avez à faire est d'ajouter les éléments suivants aux paramètres

DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'
GS_BUCKET_NAME = 'yourbacketname'
GS_DEFAULT_ACL = 'publicRead' <=ajouter à

Chemin de suivi / cause

GAE n'a pas non plus envoyé de journal des erreurs au pilote de pile Parce que le statut lui-même était de 200

Étant donné que le système d'authentification est GAE, j'ai pensé qu'il n'y aurait aucun problème à accorder des privilèges d'administrateur de stockage au compte de service par défaut. Mais ça ne marche pas

Je ne peux pas m'en empêcher, j'ai donc suivi la source de django-storage

python3.6/site-packages/storages/backends/gcloud.py


    def url(self, name):
        """
        Return public url or a signed url for the Blob.
        This DOES NOT check for existance of Blob - that makes codes too slow
        for many use cases.
        """
        name = self._normalize_name(clean_name(name))
        blob = self.bucket.blob(self._encode_name(name))
        if not self.custom_endpoint and self.default_acl == 'publicRead':
            return blob.public_url
        elif self.default_acl == 'publicRead':
            return '{storage_base_url}/{quoted_name}'.format(
                storage_base_url=self.custom_endpoint,
                quoted_name=_quote(name, safe=b"/~"),
            )
        elif not self.custom_endpoint:
            return blob.generate_signed_url(self.expiration)
        else:
            return blob.generate_signed_url(
                expiration=self.expiration,
                api_access_endpoint=self.custom_endpoint,
            )

Si vous utilisez la fonction de débogage de GAE et répétez le déploiement et le débogage dans le navigateur

blob.generate_signed_url(self.expiration)

Cette fonction semble être un méchant

En fait, je lançais une erreur, mais depuis qu'elle a été écrasée, j'ai finalement trouvé la cause avec try sauf dans le débogage GAE

"you need a private key to sign credentials.the credentials you are currently using <class 'google.auth.compute_engine.credentials.Credentials'> just contains a token.

C'était une erreur d'authentification

C'est ennuyeux, donc je n'ai pas besoin d'informations d'identification dans l'URL self.default_acl == 'publicRead': J'ai l'impression d'avoir ajouté une constante aux paramètres pour la mettre dans la branche.

fatigué···

Si vous demandez plus tard au représentant On m'a dit: «C'est cool de refaire le seau».

Pleuré

Recommended Posts

GAE & GCS & Django avec URL d'image vide
Erreur python d'aujourd'hui: l'image est vide
Qu'est-ce que wheezy dans l'image Docker Python?
Obtenir l'URL de l'image à l'aide de l'API Flickr en Python
[Django] Erreur lorsque SlugField est spécifié dans .filter ()
Conception de schémas d'URL et création de modèles dans Django
Spécifiez l'URL de la vue dans le modèle Django
Qu'est-ce que Django? .. ..
Modèle dans Django
Formulaire à Django
Paramètres d'URL de Django
Code qui énumère les noms de vue des résolveurs d'URL dans Django
Processus de codage d'URL dans la bibliothèque Cloud Storage de GAE / py