Eine Notiz, die verrückt wurde, als ich die Infrastruktur mit Django von GKE auf GAE übertrug
Ich habe ein Modul namens django-storages verwendet, um es auf GCS hochzuladen und die URL über imageField abzurufen. https://django-storages.readthedocs.io/en/latest/backends/gcloud.html?highlight=GS_DEFAULT_ACL#settings
Als ich jedoch zu GAE wechselte, war imageField wieder leer. Das Hochladen funktioniert, und wenn Django auf localhost oder GKE ausgeführt wird, funktioniert es.
Wenn Sie den Gültigkeitszeitraum der URL nicht benötigen Sie müssen lediglich Folgendes zu den Einstellungen hinzufügen
DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'
GS_BUCKET_NAME = 'yourbacketname'
GS_DEFAULT_ACL = 'publicRead' <=hinzufügen
GAE hat auch kein Fehlerprotokoll an den Stapeltreiber gesendet Weil der Status selbst 200 war
Da das Authentifizierungssystem GAE ist, dachte ich, dass es kein Problem geben würde, dem Standarddienstkonto Speicheradministratorrechte zu erteilen. Aber es funktioniert nicht
Ich kann nicht anders, also bin ich der Quelle des Django-Speichers gefolgt
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,
)
Wenn Sie die Bereitstellung und das Debuggen im Browser mithilfe der Debug-Funktion von GAE wiederholen
blob.generate_signed_url(self.expiration)
Diese Funktion scheint ein Bösewicht zu sein
Eigentlich habe ich einen Fehler geworfen, aber da er zerstört wurde, habe ich die Ursache schließlich mit try gefunden, außer beim GAE-Debugging
"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.
Es war ein Authentifizierungsfehler
Es ist ärgerlich, daher benötige ich keine Anmeldeinformationen in der URL self.default_acl == 'publicRead': Es scheint, als hätte ich den Einstellungen eine Konstante hinzugefügt, um sie in den Zweig zu setzen.
müde···
Wenn Sie den Vertreter später fragen Mir wurde gesagt: "Es ist cool, den Eimer neu zu gestalten."
Hat geweint
Recommended Posts