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. Il codice non corrispondono a un paese o a una provincia, anche se potrebbero essere visualizzati alcuni ID regione in modo simile ai codici paese e provincia di uso comune. Per le app create dopo il giorno Febbraio 2020, REGION_ID.r è incluso in 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 su una bacheca pubblica e caricare avatar con il tuo messaggio.

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 degli utenti

Dovrai modificare il modulo HTML per consentire all'utente di caricare un'immagine:

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

  2. Aggiungi l'attributo enctype al tag del modulo e specifica che si tratta di un post formato da 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 in e il 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 devi:

  1. Importa 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)

Pubblicazione dinamica delle immagini

Per pubblicare le immagini, dovrai:

  1. Crea un gestore di immagini che pubblichi dinamicamente le immagini fuori 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 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 per passare la chiave del saluto al gestore di immagini come ottiene img_id dalla richiesta.

Deployment dell'app in App Engine

Per caricare l'app guestbook, esegui questo comando dall'interno guestbook della tua applicazione in cui app.yaml e Si trovano index.yaml file:

gcloud app deploy app.yaml index.yaml

Gli indici di Datastore potrebbero richiedere del tempo prima che la tua applicazione sia disponibile. Se gli indici sono ancora processo di generazione, riceverai un NeedIndexError quando accedi alla tua app. Questo errore è temporaneo, quindi riprova più tardi se in un primo momento ricevi questo errore.

Per scoprire di più sul deployment della tua app dalla riga di comando, vedi 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