Ich weiß nicht, ob ich es falsch mache oder ob es einen Fehler (ich würde es vermuten, da ich gesehen habe, dass andere das gleiche Problem haben) in der blobstore.create_upload_url
método.
In meiner app.yaml habe ich für einige url's die Eigenschaft secure: always
und die action
Attribut des form
Element beginnt mit https://
aber wenn es von der API zurückkommt, wird es auf nicht-https umgeleitet.
Es gibt eine Fehlerdatei auf google app engine issue tracker aber keine Antwort von Google.
Kennt jemand eine gute Lösung für dieses Problem? Meine aktuelle Lösung ist eine separate .py-Datei zu haben, um die Antwort zu behandeln und dann direkt zurück zu der ursprünglichen Url aber über https.
EDITAR
Ich verwende dies, um das Aktionsattribut zu setzen:
from google.appengine.api import blobstore
view['upload_url'] = blobstore.create_upload_url
## pass the view dict to template and in template
<form action="{{ upload_url }}" enctype="multipart/form-data" method="post">
</form>
Die Ausgabe in der html-Datei sieht etwa so aus:
action="https://appid.appspot.com/_ah/upload/AMmfu6bcA9Sfz5isqw6PNNB8xzRy2rUoLaMS2GFjfPEwCZ-vg9M_hQTOR87wYdnMo7ZIbQX9NiNjORFTiKaUoLMHRpXvPf6r8Y5963GD9Cbv_9gIKgtEmtdvt5VcvQxzvbegqG3V5xQT/ALBNUaYAAAAATPdfcxxACFrQnUiLXWx61ViMDZ7F0aLF/"
Die Datei wird hochgeladen (ich kann sie in der Verwaltungskonsole->Blob-Viewer anzeigen), aber wenn die API-Umleitung zurück, leitet sie http und bei Verwendung von secure: always
eine http-Anfrage einen HTTP 405-Fehler zurückgibt.
Dies ist der Upload-Handler:
class AddUpdateImageStore(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
if self.request.get('imagestore_key'):
image = dbImageStore.ImageStore.get(self.request.get('imagestore_key'))
else:
image = dbImageStore.ImageStore()
image.name = self.request.get('image_name')
upload_files = self.get_uploads('image_file')
if upload_files:
image.imageUrl = images.get_serving_url(str(upload_files[0].key()))
imageKey = db.put(image)
for language in Settings.languages:
description = self.request.get('image_description_' + language)
if description:
imageDescription = dbImageStore.ImageDescription.gql('WHERE imageEntry = :imageEntry AND lang = :lang', imageEntry = imageKey, lang = language).get()
if imageDescription is None:
imageDescription = dbImageStore.ImageDescription()
imageDescription.imageEntry = imageKey
imageDescription.lang = language
imageDescription.description = description
db.put(imageDescription)
self.redirect('/edit/imageStore/?status=1&message=Image added/updated')