Esempi dell'API Images

ID regione

Il REGION_ID è un codice abbreviato che Google assegna in base alla regione selezionata durante la creazione dell'app. Il codice non corrisponde a un paese o a una provincia, anche se alcuni ID regione possono sembrare simili ai codici di paesi e province di uso comune. Per le app create dopo febbraio 2020, REGION_ID.r è incluso negli URL 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 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 saluto.

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 dell'utente

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

  1. Aggiungi un campo che consenta all'utente di selezionare un file dal computer 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 ottenere i dati dell'immagine dal post del modulo e memorizzarli 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}))

Trasformare le immagini

Per creare avatar 32x32, devi:

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

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

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

Pubblicazione dinamica delle immagini

Per pubblicare immagini, devi:

  1. Crea un gestore di immagini che mostri dinamicamente le immagini dal 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 l'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 l'HTML del Guestbook per passare la chiave del saluto al gestore delle immagini quando riceve img_id dalla richiesta.

Eseguire il deployment dell'app su App Engine

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

gcloud app deploy app.yaml index.yaml

Potrebbe essere necessario un po' di tempo prima che gli indici Datastore vengano generati prima che la tua applicazione sia disponibile. Se gli indici sono ancora in fase di generazione, riceverai un messaggio NeedIndexError quando accedi all'app. Questo errore è temporaneo, quindi riprova un po' più tardi se inizialmente lo ricevi.

Per scoprire di più sul deployment dell'app dalla riga di comando, vedi Deployment di un'app Python.

Visualizzare l'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