Beispiele für Images API

Regions-ID

REGION_ID ist ein abgekürzter Code, den Google anhand der Region zuweist, die Sie beim Erstellen Ihrer Anwendung ausgewählt haben. Der Code bezieht sich nicht auf ein Land oder eine Provinz, auch wenn einige Regions-IDs häufig verwendeten Länder- und Provinzcodes ähneln können. Bei Anwendungen, die nach Februar 2020 erstellt wurden, ist REGION_ID.r in den App Engine-URLs enthalten. Bei Anwendungen, die vor diesem Datum erstellt wurden, ist die Regions-ID in der URL optional.

Hier finden Sie weitere Informationen zu Regions-IDs.

Hier erfahren Sie, wie Bilder mit der Images API dynamisch hochgeladen, transformiert und bereitgestellt werden. Das folgende Beispiel basiert auf dem Gästebuch aus dem Startleitfaden. Nun hat der Nutzer die Möglichkeit, einen Avatar mit Begrüßung hochzuladen.

Bildmodell in Cloud Datastore erstellen

Sie müssen das Modell im Test-Gästebuch aktualisieren, um das hochgeladene Bild als Blob zu speichern.

class Greeting(ndb.Model):
    """Models a Guestbook entry with an author, content, avatar, and date."""
    author = ndb.StringProperty()
    content = ndb.TextProperty()
    avatar = ndb.BlobProperty()
    date = ndb.DateTimeProperty(auto_now_add=True)

Bilder von Nutzern hochladen

Sie müssen das HTML-Formular ändern, damit der Nutzer ein Bild hochladen kann:

  1. Fügen Sie ein Feld hinzu, mit dem der Nutzer auf seinem Computer eine Datei zum Hochladen auswählen kann.

  2. Fügen Sie dem Formular-Tag das Attribut enctype hinzu und geben Sie an, dass es sich um einen Formularpost mit mehreren Teilen handelt.

    self.response.out.write("""
          <form action="/sign?%s"
                enctype="multipart/form-data"
                method="post">
            <div>
              <textarea name="content" rows="3" cols="60"></textarea>
            </div>
            <div><label>Avatar:</label></div>
            <div><input type="file" name="img"/></div>
            <div><input type="submit" value="Sign Guestbook"></div>
          </form>
          <hr>
          <form>Guestbook name: <input value="%s" name="guestbook_name">
          <input type="submit" value="switch"></form>
        </body>
      </html>""" % (urllib.urlencode({'guestbook_name': guestbook_name}),
                    cgi.escape(guestbook_name)))
  3. Aktualisieren Sie den Gästebuch-Handler, um die Bilddaten aus dem Formularpost abzurufen und speichern Sie sie im Datenspeicher als Blob.

    class Guestbook(webapp2.RequestHandler):
        def post(self):
            guestbook_name = self.request.get('guestbook_name')
            greeting = Greeting(parent=guestbook_key(guestbook_name))
    
            if users.get_current_user():
                greeting.author = users.get_current_user().nickname()
    
            greeting.content = self.request.get('content')
    
            avatar = self.request.get('img')
            avatar = images.resize(avatar, 32, 32)
            greeting.avatar = avatar
            greeting.put()
    
            self.redirect('/?' + urllib.urlencode(
                {'guestbook_name': guestbook_name}))

Bilder transformieren

So erstellen Sie Bilder im Format 32 x 32:

  1. Importieren Sie das Modul google.appengine.api.images.

    from google.appengine.api import images
  2. Rufen Sie die Funktion resize auf und übergeben Sie die Bilddaten.

    avatar = images.resize(avatar, 32, 32)

Dynamische Übermittlung von Bildern

So stellen Sie Bilder bereit:

  1. Erstellen Sie einen Bild-Handler, der Bilder dynamisch aus dem Pfad /img bereitstellt.

    class Image(webapp2.RequestHandler):
        def get(self):
            greeting_key = ndb.Key(urlsafe=self.request.get('img_id'))
            greeting = greeting_key.get()
            if greeting.avatar:
                self.response.headers['Content-Type'] = 'image/png'
                self.response.out.write(greeting.avatar)
            else:
                self.response.out.write('No image')
  2. Aktualisieren Sie den HTML-Code, um diese dynamisch bereitgestellten Bilder anzuzeigen.

    self.response.out.write('<div><img src="/img?img_id=%s"></img>' %
                            greeting.key.urlsafe())
    self.response.out.write('<blockquote>%s</blockquote></div>' %
                            cgi.escape(greeting.content))

Sie müssen den HTML-Code des Gästebuchs aktualisieren, um den Schlüssel der Begrüßung an den Bild-Handler zu übergeben, wenn er die img_id aus der Anfrage abruft.

App für App Engine bereitstellen

Zum Hochladen der App führen Sie den folgenden Befehl im guestbook-Verzeichnis Ihres Projekts aus, in dem sich die Dateien app.yaml und index.yaml befinden:

gcloud app deploy app.yaml index.yaml

Die Generierung der Datenspeicherindexe kann einige Zeit dauern, bevor Ihre Anwendung zur Verfügung steht. Wenn die Indexe noch generiert werden, erhalten Sie beim Zugriff auf Ihre App die Nachricht NeedIndexError. Dieser Fehler ist nur vorübergehend. Versuchen Sie es später noch einmal, falls Sie zuerst diesen Fehler erhalten.

Weitere Informationen zum Bereitstellen der Anwendung über die Befehlszeile finden Sie unter Python-Anwendung bereitstellen.

Bereitgestellte Anwendung ansehen

Führen Sie den folgenden Befehl aus, um Ihren Browser zu starten und sich die Anwendung unter https://PROJECT_ID.REGION_ID.r.appspot.com anzeigen zu lassen:

gcloud app browse