Esempi di API Images

ID regione

REGION_ID è un codice abbreviato assegnato da Google in base alla regione selezionata al momento della creazione dell'app. Non corrisponde a un paese o a una provincia, anche se alcuni ID regione possono apparire simili ai codici di paese e provincia di uso comune. Per le app create dopo febbraio 2020, REGION_ID.r è incluso negli URL di App Engine. Per le app esistenti create prima di questa data, l'ID regione è facoltativo nell'URL.

Scopri di più sugli ID regione.

Scopri come caricare, trasformare, archiviare e pubblicare le immagini in modo dinamico utilizzando l'API Images. Questo esempio descrive come pubblicare messaggi in una bacheca pubblica e caricare un avatar con il tuo messaggio di benvenuto.

Creazione di un modello di immagine in Datastore

Devi aggiornare il modello dall'esempio del guestbook per archiviare l'immagine caricata come blob.

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)

Caricamento delle immagini utente

Per consentire all'utente di caricare un'immagine, devi modificare il modulo HTML:

  1. Aggiungi un campo che consenta all'utente di selezionare dal proprio computer un file da caricare.

  2. Aggiungi l'attributo enctype al tag del modulo e specifica che si tratta di un post del modulo in più parti.

    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. Aggiorna il gestore Guestbook per recuperare i dati dell'immagine dal post del modulo e archiviarli come BLOB nel datastore.

    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}))

Trasformazione delle immagini

Per creare avatar 32 x 32 dovrai:

  1. Importare il modulo google.appengine.api.images.

    from google.appengine.api import images
  2. Richiama la funzione resize e passa i dati dell'immagine.

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

Immagini con pubblicazione dinamica

Per pubblicare immagini, dovrai:

  1. Crea un gestore di immagini che pubblichi dinamicamente le immagini al di fuori del percorso /img.

    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. Aggiorna il codice HTML per visualizzare queste immagini pubblicate dinamicamente.

    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))

Dovrai aggiornare il codice HTML del guestbook in modo da passare la chiave del saluto al gestore di immagini quando riceve img_id dalla richiesta.

Deployment dell'app in App Engine

Per caricare l'app guestbook, esegui questo comando dalla directory guestbook dell'applicazione in cui si trovano i file app.yaml e index.yaml:

gcloud app deploy app.yaml index.yaml

La generazione degli indici di Datastore potrebbe richiedere un po' di tempo prima che l'applicazione sia disponibile. Se gli indici sono ancora in fase di generazione, riceverai un messaggio NeedIndexError quando accederai all'app. Questo errore è temporaneo, quindi riprova più tardi se all'inizio ricevi questo errore.

Per scoprire di più sul deployment dell'app dalla riga di comando, consulta Eseguire il deployment di un'app Python.

Visualizzazione dell'applicazione di cui è stato eseguito il deployment

Per avviare il browser e visualizzare l'app all'indirizzo https://PROJECT_ID.REGION_ID.r.appspot.com, esegui questo comando:

gcloud app browse