Zusammenfassung
In diesem Codelab erfahren Sie, wie Sie eine Python Flask-Webanwendung in der flexiblen App Engine-Umgebung bereitstellen. In der Beispielanwendung kann ein Nutzer ein Foto vom Gesicht einer Person hochladen und erfahren, wie wahrscheinlich es ist, dass die Person glücklich 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 in Abhängigkeit vom eingehenden Traffic skaliert. Load-Balancing, Mikrodienste, Autorisierung, SQL- und NoSQL-Datenbanken, Traffic-Aufteilung, Logging, Suche, Versionsverwaltung, Rollouts und Rollbacks sowie Sicherheitsscans werden nativ unterstützt und können individuell angepasst werden.
Die flexible Umgebung von App Engine unterstützt alle folgenden Programmiersprachen: C#, Go, Java, Node.js, PHP, Python und Ruby. In der flexiblen App Engine-Umgebung wird Ihre Anwendung in Docker-Containern ausgeführt, die auf virtuellen Maschinen von Google Compute Engine ausgeführt werden. Die Standardumgebung von App Engine ist eine alternative Option für bestimmte Sprachen, z. B. Python. In der App Engine-Standardumgebung wird Ihre Anwendung in einer restriktiveren Sandbox-Umgebung ausgeführt. 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
- Verwalten verschiedener Cloud-Ressourcen mit der Google Cloud Console und dem Google Cloud SDK
- Cloud Shell verwenden
Voraussetzungen
- Python-Vorkenntnisse
- Erfahrung mit standardmäßigen Linux-Texteditoren wie vim, emacs oder nano ist von Vorteil
Projekterstellung
Wenn Sie noch kein Google-Konto (Gmail oder Google Apps) haben, müssen Sie eins erstellen. Melden Sie sich in der Google Cloud Platform Console (console.cloud.google.com) 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 später in diesem Codelab als PROJECT_ID bezeichnet.
Abrechnung
Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Google Cloud-Ressourcen verwenden zu können.
Dieses Codelab sollte Sie nicht mehr als ein paar Dollar kosten, aber es könnte mehr sein, wenn Sie sich für mehr Ressourcen entscheiden oder wenn Sie sie laufen lassen.
Neuen Nutzern der Google Cloud Platform steht eine kostenlose Testversion mit einem Guthaben von 300$ zur Verfügung.
Während Sie Google Cloud von Ihrem Laptop aus per Fernzugriff nutzen können, wird in diesem Codelab Google Cloud Shell verwendet, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird. Auf dieser Debian-basierten virtuellen Maschine sind alle erforderlichen Entwicklungstools (gcloud, python, virtualenv, pip usw.) installiert. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und wird in der Google Cloud ausgeführt, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Für dieses Codelab benötigen Sie also nur einen Browser (es funktioniert auch auf einem Chromebook).
Klicken Sie zum Aktivieren von Google Cloud Shell einfach rechts oben in der Entwicklerkonsole auf die Schaltfläche. Das Bereitstellen und Herstellen einer Verbindung zur Umgebung dauert nur wenige Augenblicke:


Sobald Sie mit der Cloud Shell verbunden sind, sollten Sie sehen, dass Sie bereits authentifiziert sind und das Projekt bereits auf Ihre PROJECT_ID eingestellt ist:
gcloud auth list Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project [core] Project = <PROJECT_ID>
Wenn das Projekt aus irgendeinem Grund 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 nach, welche Projekt-ID Sie in den Einrichtungsschritten verwendet haben, oder suchen Sie im Konsolen-Dashboard danach:

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 wir die Vision-, Storage- und Datastore-APIs verwenden können, müssen Sie die APIs 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 API, die Storage API und die Datastore API sind Dienstkonto-Anmeldedaten erforderlich. Mit dem gcloud-Tool können Sie Anmeldedaten für Dienstkonten aus Ihrem Projekt generieren.
Legen Sie eine Umgebungsvariable für Ihre PROJECT_ID fest und ersetzen Sie [YOUR_PROJECT_ID] durch Ihre 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/ownerWenn 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.comMit diesem Befehl wird ein Dienstkontoschlüssel generiert, der in einer JSON-Datei mit dem Namen key.json in Ihrem Basisverzeichnis gespeichert wird.
Legen Sie eine Umgebungsvariable für den Dienstkontoschlüssel in der Cloud Shell fest und verwenden Sie dazu dessen absoluten Pfad.
export GOOGLE_APPLICATION_CREDENTIALS="/home/${USER}/key.json"Virtuelle Umgebung starten und Abhängigkeiten installieren
Erstellen Sie mit virtualenv eine isolierte Python 3-Umgebung mit dem Namen env:
virtualenv -p python3 env
Geben Sie die neu erstellte Umgebung 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 createStorage Bucket erstellen
Legen Sie die Umgebungsvariable CLOUD_STORAGE_BUCKET auf Ihre PROJECT_ID fest. Grundsätzlich wird empfohlen, den Bucket nach der PROJECT_ID zu benennen.
export CLOUD_STORAGE_BUCKET=${PROJECT_ID}Unsere Anwendung verwendet einen Cloud Storage-Bucket, den Sie mit einem Tool namens gsutil in Cloud Shell erstellen müssen. Führen Sie den folgenden Befehl aus, um einen Bucket zu erstellen, der nach der PROJECT_ID benannt ist.
gsutil mb gs://${PROJECT_ID}Anwendung ausführen
python main.py
Wenn die Anwendung gestartet wurde, klicken Sie in der Cloud Shell-Symbolleiste auf das Symbol für die 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:

Laden Sie ein Foto mit einem menschlichen Gesicht hoch. Klicken Sie auf die Schaltfläche Datei auswählen, wählen Sie ein Bild auf Ihrem Computer aus und klicken Sie dann auf Senden.
Nach dem Hochladen des Fotos sollten Sie in etwa Folgendes sehen:

Format des Beispielcodes
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.
Die Anwendung nutzt die Google Cloud Platform-Clientbibliotheken für die Vision, Storage und Datastore APIs, sodass Sie ganz einfach mit Ihrer bevorzugten Programmiersprache auf die Cloud APIs zugreifen können.
Werfen wir einen Blick auf einige Teile des Codes.
Über den Abschnitt "imports" ganz oben werden die verschiedenen Pakete importiert, die wir für unseren Code benötigen, z. B. die Google Cloud-Clientbibliotheken für die Datastore, Storage und Vision APIs:
from google.cloud import datastore
from google.cloud import storage
from google.cloud import visionDer 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 eine Abfrage auf Entitäten des Typs Faces in Datastore aus. Schließlich wird die HTML-Vorlage gerendert, indem die image_entities übergeben werden, die dazu aus Datastore als Variable extrahiert werden.
@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/.
homepage.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 app.yaml mit einem Editor Ihrer Wahl, z. B. vim, nano oder emacs. Wir verwenden hier den Editor nano:
nano app.yamlapp.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
In app.yaml ersetzen Sie <your-cloud-storage-bucket > durch den Namen Ihres Cloud Storage-Buckets. Wenn Sie ihn nicht mehr wissen, können Sie die GCP-Projekt-ID aus Qwiklabs kopieren. Sie 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:

Geben Sie y ein und drücken Sie dann noch einmal die Eingabetaste, um den Dateinamen zu bestätigen:

Stellen Sie die Anwendung mit gcloud in App Engine bereit:
gcloud app deployNachdem die Anwendung bereitgestellt wurde, können Sie sie über die URL https://< PROJECT_ID >.appspot.com im Webbrowser aufrufen.
Zusammenfassung
In diesem Schritt haben Sie eine Python-Webanwendung eingerichtet und in der flexiblen App Engine-Umgebung bereitgestellt.
Sie haben Ihre erste App Engine-Webanwendung in der flexiblen Umgebung geschrieben und bereitgestellt.
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 oben auf „Löschen“. Das Projekt wird dann zum Löschen geplant.
Weitere Informationen
- Python in der Google Cloud Platform: https://cloud.google.com/python/
- Dokumentation zur flexiblen Google App Engine-Umgebung für Python: https://cloud.google.com/appengine/docs/flexible/python/
- Dokumentation für die Python-Clientbibliotheken: Datastore, Storage und Vision
- Weitere Python-Codebeispiele: https://cloud.google.com/python/samples
Lizenz
Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.