Python Flask-Webanwendung in der flexiblen App Engine-Umgebung bereitstellen

Zusammenfassung

In diesem Codelab lernen Sie, wie Sie eine Python Flask-Webanwendung in der flexiblen App Engine-Umgebung bereitstellen. In der Beispielanwendung kann ein Nutzer ein Foto eines Gesichts hochladen und herausfinden, wie wahrscheinlich es ist, dass der Nutzer zufrieden ist. Die Anwendung verwendet Google Cloud APIs für Vision, Storage und Datastore.

App Engine

Google App Engine-Anwendungen lassen sich einfach erstellen, verwalten und skalieren, wenn sich Traffic und Datenspeicheranforderungen ändern. Mit App Engine müssen keine Server verwaltet werden. Sie laden einfach Ihre Anwendung hoch und es kann losgehen.

App Engine-Anwendungen werden auf der Basis des eingehenden Traffics automatisch skaliert. Load-Balancing, Mikrodienste, Autorisierung, SQL- und NoSQL-Datenbanken, Traffic-Aufteilung, Logging, Suche, Versionierung, Roll-outs und Rollbacks sowie Sicherheitsscans sind nativ möglich und können individuell angepasst werden.

Die flexible Umgebung von App Engine unterstützt alle der folgenden Programmiersprachen: C#, Go, Java, Node.js, PHP, Python und Ruby. Die flexible App Engine-Anwendung führt Ihre Anwendung in Docker-Containern aus, die auf virtuellen Google Compute Engine-Maschinen ausgeführt werden. Die Standardumgebung von App Engine ist eine alternative Option für bestimmte Sprachen, darunter Python. App Engine Standard führt Ihre Anwendung in einer restriktiveren Sandbox-Umgebung aus. Weitere Informationen finden Sie unter App Engine-Umgebung auswählen.

Lerninhalte

  • Einfache Webanwendung in der flexiblen App Engine-Umgebung bereitstellen
  • Google Cloud-Clientbibliotheken für die Vision, Storage und Datastore APIs verwenden
  • Die Google Cloud Console und das Google Cloud SDK verwenden, um verschiedene Cloud-Ressourcen zu verwalten
  • Cloud Shell verwenden

Voraussetzungen

  • Python-Vorkenntnisse
  • Erfahrung mit standardmäßigen Linux-Texteditoren wie vim, emacs oder nano ist von Vorteil

Projekt erstellen

Wenn Sie noch kein Google-Konto haben (Gmail oder Google Apps), müssen Sie eines erstellen. Melden Sie sich unter console.cloud.google.com in der Google Cloud Platform Console an und erstellen Sie ein neues Projekt:

Notieren Sie sich die Projekt-ID, also den projektübergreifend nur einmal vorkommenden Namen eines Google Cloud-Projekts. Der oben angegebene Name ist bereits vergeben und kann leider nicht mehr verwendet werden. Sie wird in diesem Codelab später als PROJECT_ID bezeichnet.

Abrechnung

Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Google Cloud-Ressourcen zu nutzen.

Das Durcharbeiten dieses Codelabs sollte nicht mehr als ein paar Euro kosten. Es kann aber auch sein, dass du mehr Ressourcen benötigst oder wenn du sie nicht mehr nutzen möchtest.

Neuen Google Cloud Platform-Nutzern steht ein kostenloser Testzeitraum im Wert von 300$ zur Verfügung.

Google Cloud kann aus der Ferne über Ihren Laptop ausgeführt werden. In diesem Codelab nutzen wir Google Cloud Shell, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird. Diese Debian-basierte virtuelle Maschine ist mit allen Entwicklertools ausgestattet, die Sie benötigen (gcloud, python, gsuite, pip usw.). Sie bietet ein Basisverzeichnis mit 5 GB Speicherplatz, wird in Google Cloud ausgeführt und erhöht die Netzwerkleistung und -authentifizierung erheblich. Für dieses Codelab ist also nur ein Browser erforderlich, er funktioniert auch auf einem Chromebook.

Klicken Sie zum Aktivieren von Google Cloud Shell in der Entwicklerkonsole einfach auf die Schaltfläche oben rechts. Es dauert nur einen Moment, bis die Umgebung bereitgestellt und eine Verbindung hergestellt wird.

Wenn die Verbindung zur Cloud Shell hergestellt wurde, sehen Sie, dass Sie bereits authentifiziert sind und dass das Projekt auf Ihre PROJECT_ID festgelegt ist:

gcloud auth list
Credentialed accounts:
- <myaccount>@<mydomain>.com (active)
gcloud config list project
[core]
Project = <PROJECT_ID>

Wenn das Projekt nicht festgelegt ist, geben Sie einfach den folgenden Befehl ein:

gcloud config set project <PROJECT_ID>

Sie wissen nicht, wie Ihre Projekt-ID lautet? Sehen Sie sich an, welche Projekt-ID Sie in den Einrichtungsschritten verwendet haben, oder suchen Sie sie im Dashboard der Konsole:

Geben Sie in Cloud Shell folgenden Befehl in die Befehlszeile ein, um das GitHub-Repository zu klonen:

git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

Wechseln Sie zum Verzeichnis python-docs-samples/codelabs/flex_and_vision:

cd python-docs-samples/codelabs/flex_and_vision

Bevor Sie die Vision, Storage und Datastore APIs verwenden können, müssen Sie sie mit den folgenden Befehlen aktivieren:

gcloud services enable vision.googleapis.com
gcloud services enable storage-component.googleapis.com
gcloud services enable datastore.googleapis.com

Für Anfragen an die Vision, Storage und Datastore APIs sind Anmeldedaten für ein Dienstkonto erforderlich. Die Anmeldedaten für das Dienstkonto aus Ihrem Projekt können mit dem gcloud-Tool generiert werden.

Legen Sie eine Umgebungsvariable für Ihre PROJECT_ID fest und ersetzen Sie [YOUR_PROJECT_ID] durch Ihre eigene Projekt-ID:

export PROJECT_ID=[YOUR_PROJECT_ID]

Erstellen Sie ein Dienstkonto, um die Google Cloud APIs für lokale Tests zu nutzen:

gcloud iam service-accounts create codelab \
  --display-name "My Codelab Service Account"

Weisen Sie dem neu erstellten Dienstkonto die entsprechenden Berechtigungen zu:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:codelab@${PROJECT_ID}.iam.gserviceaccount.com \
--role roles/owner

Wenn Sie das Dienstkonto eingerichtet haben, erstellen Sie einen Dienstkontoschlüssel:

gcloud iam service-accounts keys create ~/key.json \
--iam-account codelab@${PROJECT_ID}.iam.gserviceaccount.com

Mit diesem Befehl wird ein Dienstkontoschlüssel generiert, der in einer JSON-Datei mit dem Namen key.json in Ihrem Basisverzeichnis gespeichert wird.

Legen Sie mithilfe des absoluten Pfads des generierten Schlüssels in der Cloud Shell eine Umgebungsvariable für Ihren Dienstkontoschlüssel fest:

export GOOGLE_APPLICATION_CREDENTIALS="/home/${USER}/key.json"

Weitere Informationen zum Authentifizieren der Vision API

Virtuelle Umgebung starten und Abhängigkeiten installieren

Erstellen Sie eine isolierte Python 3-Umgebung mit dem Namen env mit gsuite:

virtualenv -p python3 env

Geben Sie die neu erstellte gsuite-Datei mit dem Namen env ein:

source env/bin/activate

Installieren Sie mit pip über die Datei requirements.txt Abhängigkeiten für Ihr Projekt:

pip install -r requirements.txt

Die Datei requirements.txt enthält eine Liste mit Paketabhängigkeiten, die Sie für Ihr Projekt benötigen. Mit dem Befehl oben werden alle aufgeführten Paketabhängigkeiten in virtualenv heruntergeladen.

App Engine-Anwendung erstellen

Als Nächstes erstellen Sie eine App Engine-Instanz:

gcloud app create

Storage Bucket erstellen

Legen Sie zuerst die Umgebungsvariable CLOUD_STORAGE_BUCKET auf den Namen Ihrer PROJECT_ID fest. Es wird normalerweise empfohlen, den Bucket mit dem Namen von PROJECT_ID zu benennen.

export CLOUD_STORAGE_BUCKET=${PROJECT_ID}

Die Anwendung verwendet einen Cloud Storage-Bucket, den Sie in Cloud Shell mit dem Tool gsutil erstellen müssen. Führen Sie den folgenden Befehl aus. Dadurch wird ein Bucket mit demselben Namen wie Ihre PROJECT_ID erstellt.

gsutil mb gs://${PROJECT_ID}

Anwendung ausführen

python main.py

Klicken Sie nach dem Start der Anwendung in der Cloud Shell-Symbolleiste auf „Webvorschau“ und wählen Sie „Vorschau auf Port 8080“ aus.

Im Browser wird ein Tab geöffnet und eine Verbindung zum soeben gestarteten Server hergestellt. Auf dem Bildschirm sollte Folgendes zu sehen sein:

Screenshot 2017-02-23 um 19:22:50 Uhr.png

Laden Sie ein Foto hoch, das ein menschliches Gesicht enthält. Klicken Sie auf die Schaltfläche Datei auswählen, wählen Sie ein Bild von Ihrem Computer aus und klicken Sie dann auf Senden.

Nach dem Hochladen des Fotos sollten Sie in etwa Folgendes sehen:

Screenshot 2017-02-23 um 19:32 Uhr.png

Codelayout

Das Beispiel hat das folgende Layout:

templates/
  homepage.html   /* HTML template that uses Jinja2 */
app.yaml          /* App Engine application configuration file */
main.py           /* Python Flask web application */
requirements.txt  /* List of dependencies for the project */

main.py

Diese Python-Datei ist eine Flask-Webanwendung. Nutzer können damit Fotos von Gesichtern hochladen, die in Cloud Storage gespeichert und mit der Gesichtserkennungsfunktion der Cloud Vision API analysiert werden. Wichtige Informationen zu jedem Foto werden in Datastore gespeichert und jedes Mal abgerufen, wenn ein Nutzer die Website besucht. Datastore ist die NoSQL-Datenbank der Google Cloud Platform.

Diese Anwendung verwendet die Google Cloud Platform-Clientbibliotheken für Storage, Datastore und Vision. Mit diesen Clientbibliotheken können Sie in Ihren bevorzugten Programmiersprachen ganz einfach auf Cloud APIs zugreifen.

Werfen wir einen Blick auf einige Teile des Codes.

Im Abschnitt oben werden die verschiedenen Pakete importiert, die wir für unseren Code benötigen. So importieren wir unsere Google Cloud-Clientbibliotheken für Datastore, Storage und Vision:

from google.cloud import datastore
from google.cloud import storage
from google.cloud import vision

Der folgende Code zeigt, was passiert, wenn jemand die Stamm-URL der Website besucht: Wir erstellen ein Datastore-Clientobjekt, das für den Zugriff auf die Datastore-Clientbibliothek verwendet wird. Anschließend führen wir in Datastore eine Abfrage für Entitäten des Typs Faces aus. Zum Schluss rendern wir unsere HTML-Vorlage und übergeben die image_entities, die wir aus Datastore als Variable extrahieren.

@app.route('/')
def homepage():
    # Create a Cloud Datastore client.
    datastore_client = datastore.Client()

    # Use the Cloud Datastore client to fetch information from Datastore about
    # each photo.
    query = datastore_client.query(kind='Faces')
    image_entities = list(query.fetch())

    # Return a Jinja2 HTML template and pass in image_entities as a parameter.
    return render_template('homepage.html', image_entities=image_entities)

Sehen wir uns jetzt an, wie Entitäten in Datastore gespeichert werden. Datastore ist die NoSQL-Datenbanklösung von Google Cloud. Die Daten werden dort in Objekten gespeichert, die auch als Entitäten bezeichnet werden. Jeder Entität ist ein eindeutiges key-Element zugewiesen, das mit einem kind- und einem key name-String erstellt werden kann. Ein kind-Element beschreibt, worum es sich bei der Entität handelt, z. B. Fotos, Personen oder Tiere.

Jede Entität kann mehrere von den Entwicklern definierte properties (Eigenschaften) haben, denen unterschiedliche Werttypen zugeordnet sind, wie Ganzzahlen, Gleitkommazahlen, Strings, Datumsangaben oder Binärdaten.

    # Create a Cloud Datastore client.
    datastore_client = datastore.Client()

    # Fetch the current date / time.
    current_datetime = datetime.now()

    # The kind for the new entity.
    kind = 'Faces'

    # The name/ID for the new entity.
    name = blob.name

    # Create the Cloud Datastore key for the new entity.
    key = datastore_client.key(kind, name)

    # Construct the new entity using the key. Set dictionary values for entity
    # keys blob_name, storage_public_url, timestamp, and joy.
    entity = datastore.Entity(key)
    entity['blob_name'] = blob.name
    entity['image_public_url'] = blob.public_url
    entity['timestamp'] = current_datetime
    entity['joy'] = face_joy

    # Save the new entity to Datastore.
    datastore_client.put(entity)

Auf die Storage- und Vision-Clientbibliothek kann ähnlich wie auf die Datastore-Clientbibliothek programmgesteuert zugegriffen werden. Öffnen Sie einfach die Datei main.py in vim, emacs oder nano, um sich den ganzen Beispielcode anzusehen.

Weitere Informationen zu Flask finden Sie unter http://flask.pocoo.org/.

Weitere Informationen zu Clientbibliotheken finden Sie unter https://googlecloudplatform.github.io/google-cloud-python/.

Startseite.html

Das Flask-Webframework nutzt Jinja2 als Vorlagen-Engine. Variablen und Ausdrücke, die beim Rendern der Seite automatisch durch Werte ersetzt werden, können daher von main.py an homepage.html übergeben werden.

Weitere Informationen zu Jinja2: http://jinja.pocoo.org/docs/2.9/templates/

Diese Jinja2-HTML-Vorlage enthält ein Formular, mit dem Nutzer Fotos an die Datenbank senden können. Außerdem führt sie alle bisher gesendeten Bilder mit Angaben zum Dateinamen, zum Upload-Datum und zur Wahrscheinlichkeit auf, dass das von der Vision API erkannte Gesicht einen glücklichen Menschen darstellt.

homepage.html

<h1>Google Cloud Platform - Face Detection Sample</h1>

<p>This Python Flask application demonstrates App Engine Flexible, Google Cloud
Storage, Datastore, and the Cloud Vision API.</p>

<br>

<html>
  <body>
    <form action="upload_photo" method="POST" enctype="multipart/form-data">
      Upload File: <input type="file" name="file"><br>
      <input type="submit" name="submit" value="Submit">
    </form>
    
  </body>
</html>

In der flexiblen App Engine-Umgebung wird für die Konfiguration zur Bereitstellung der Anwendung die Datei app.yaml verwendet. Wenn diese Datei nicht vorhanden ist, versucht App Engine, die Konfiguration selbst zu bestimmen. Es ist allerdings besser, diese Datei zur Verfügung zu stellen.

Als Nächstes ändern Sie die Datei app.yaml mit einem Editor Ihrer Wahl vim, nano oder emacs. Wir verwenden hier den Editor nano:

nano app.yaml

app.yaml

runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app

runtime_config:
    python_version: 3

env_variables:
    CLOUD_STORAGE_BUCKET: <your-cloud-storage-bucket>

Das ist die Basiskonfiguration für die Bereitstellung einer Python 3-Anwendung in der flexiblen App Engine-Umgebung. Weitere Informationen zum Konfigurieren von App Engine

Öffnen Sie app.yaml und ersetzen Sie < Ihr-cloud-storage-bucket > durch den Namen Ihres Cloud Storage-Buckets. (Wenn Sie den Namen Ihres Cloud Storage-Buckets vergessen haben, kopieren Sie die GCP-Projekt-ID von Qwiklabs. Diese ist identisch). Im Codeabschnitt env_variables werden Umgebungsvariablen eingerichtet, die nach der Bereitstellung der Anwendung in main.py verwendet werden.

Sie können die Datei jetzt mit Strg + X in nano speichern und schließen, woraufhin Sie diese Meldung sehen:

Screenshot 17.02.2017 um 16:47 Uhr.png

Geben Sie einen Buchstaben Y ein und drücken Sie dann die Taste Eingabetaste noch einmal, um den Dateinamen für die folgende Aufforderung zu bestätigen:

Screenshot 24.02.2017 um 16:18:23 Uhr.png

Stellen Sie die Anwendung mit gcloud in App Engine bereit:

gcloud app deploy

Nachdem die Anwendung bereitgestellt wurde, können Sie sie aufrufen. Öffnen Sie dazu die URL https://< PROJECT_ID >.appspot.com in Ihrem Webbrowser.

Zusammenfassung

In diesem Schritt richten Sie eine Python-Webanwendung ein und stellen sie in der flexiblen App Engine-Umgebung bereit.

Sie haben gelernt, wie Sie Ihre erste flexible App Engine-Webanwendung schreiben und bereitstellen.

Bereinigen

So vermeiden Sie, dass Ihr Google Cloud Platform-Konto für die in diesem Schnellstart verwendeten Ressourcen belastet wird:

  • Rufen Sie die Cloud Platform Console auf.
  • Wählen Sie das Projekt aus, das Sie beenden möchten, und klicken Sie dann oben auf „Löschen“. Dadurch wird das Projekt zum Löschen eingeplant.

Weitere Informationen

Lizenz

Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.