Beispiel für App Engine und Google Cloud Storage

Erfahren Sie, wie Sie den Cloud Storage-Zugriff auf Ihre Python-Anwendung in App Engine auswählen und Dateien im Cloud Storage-Bucket erstellen, schreiben, lesen und auflisten.

In dieser Anleitung wird davon ausgegangen, dass Sie mit Python vertraut sind und den Abschnitt Schnellstart für die App Engine-Standardumgebung mit Python bereits durchgegangen sind.

In diesem Beispiel wird ein Skript ausgeführt, das Daten an den Browser ausgibt. Das Skript zeigt die folgenden Funktionen der Cloud Storage-Clientbibliothek:

  • Eine Datei erstellen und diese Datei in einen Bucket schreiben
  • Die Datei lesen und ihre Metadaten abrufen
  • Mehrere Dateien erstellen und anschließend aus dem Bucket auflisten
  • Die Dateien auflisten, die gerade zum Bucket hinzugefügt wurden
  • Diese Dateigruppe lesen
  • Diese Dateigruppe löschen

Ziele

  • Python-Projekt durchgehen und das erforderliche Layout und die erforderlichen Dateien aufrufen
  • Code für die Verbindung mit Cloud Storage verstehen
  • Code zum Erstellen, Schreiben, Lesen, Auflisten und Löschen von Dateien verstehen
  • Code für Wiederholungen verstehen
  • Anwendung auf Ihrem lokalen Entwicklungsserver erstellen und testen
  • Anwendung für die Produktion in Google App Engine bereitstellen

Kosten

App Engine kann kostenlos genutzt werden. Wenn Ihre Nutzung von App Engine nicht das unter Kostenloses App Engine-Kontingent festgelegte Limit übersteigt, werden für diese Anleitung keine Gebühren erhoben.

Hinweis

Bevor Sie dieses Beispiel ausführen können, benötigen Sie eine Projekt-ID, das gcloud-Befehlszeilentool und einen Cloud Storage-Bucket:

  1. Erstellen Sie ein neues GCP Console-Projekt oder rufen Sie die Projekt-ID eines vorhandenen Projekts über die Google Cloud Platform Console ab:

    Seite "Projekte" aufrufen

    Tipp: Rufen Sie mit dem Befehlszeilentool gcloud eine Liste der vorhandenen Projekt-IDs ab.

  2. Installieren Sie das Google Cloud SDK und initialisieren Sie es:

    SDK herunterladen

  3. Aktivieren Sie den standardmäßigen Cloud Storage-Bucket.

Anleitungsprojekt klonen

Das Projekt klonen:

  1. Klonen Sie die Clientbibliothek und die Beispielanwendung (Demo) auf Ihrem lokalen Computer.

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

    Sie können auch das Beispiel als ZIP-Datei herunterladen und extrahieren.

  2. Gehen Sie im geklonten oder heruntergeladenen Projekt zum entsprechenden Verzeichnis:

    cd python-docs-samples/appengine/standard/storage/appengine-client
    

Abhängigkeiten installieren

Mit dem Tool virtualenv können Sie eine saubere Python-Umgebung auf Ihrem System erstellen. Bei der App Engine-Entwicklung trägt dies dazu bei, dass der von Ihnen lokal getestete Code der Umgebung ähnelt, in der Ihr Code bereitgestellt werden soll. Weitere Informationen finden Sie unter Drittanbieterbibliotheken verwenden.

virtualenv und die Abhängigkeiten des Beispiels installieren:

Mac OS/Linux

  1. Installieren Sie virtualenv, wenn es noch nicht installiert ist, systemübergreifend mit dem Befehl pip:
    sudo pip install virtualenv
  2. Erstellen Sie eine isolierte Python-Umgebung in einem Verzeichnis außerhalb Ihres Projekts und aktivieren Sie diese:
    virtualenv env
    source env/bin/activate
  3. Wechseln Sie zu Ihrem Projektverzeichnis und installieren Sie die Abhängigkeiten:
    cd YOUR_PROJECT
    pip install -t lib -r requirements.txt

Windows

Wenn Sie das Cloud SDK installiert haben, sollte Python 2.7 bereits installiert sein, in der Regel in C:\python27_x64\ (bei 64-Bit-Systemen). Führen Sie Ihre Python-Pakete mit PowerShell aus.

  1. Wechseln Sie zu Ihrer Installation von PowerShell.
  2. Klicken Sie mit der rechten Maustaste auf die Verknüpfung zu PowerShell und starten Sie diese als Administrator.
  3. Versuchen Sie, den Befehl python auszuführen. Wenn Python nicht gefunden wird, fügen Sie den Python-Ordner dem PATH Ihrer Umgebung hinzu.
    $env:Path += ";C:\python27_x64\"
  4. Wenn virtualenv noch nicht installiert ist, installieren Sie es systemübergreifend mit dem Befehl pip:
    python -m pip install virtualenv
  5. Erstellen Sie eine isolierte Python-Umgebung in einem Verzeichnis außerhalb Ihres Projekts und aktivieren Sie diese:
    python -m virtualenv env
    env\Scripts\activate
  6. Wechseln Sie zu Ihrem Projektverzeichnis und installieren Sie die Abhängigkeiten:
    cd YOUR_PROJECT
    python -m pip install -t lib -r requirements.txt

Der Beispielcode, den Sie geklont oder heruntergeladen haben, enthält bereits die Datei appengine_config.py. Diese muss App Engine anweisen, beim Laden der Abhängigkeiten sowohl lokal als auch bei der Bereitstellung den Ordner lib zu verwenden.

Lokal ausführen

Beispiel lokal ausführen:

  1. Führen Sie die Anwendung im Projektunterverzeichnis python-docs-samples/appengine/standard/storage/appengine-client auf dem lokalen Entwicklungsserver aus:

    dev_appserver.py .
    
  2. Warten Sie auf die Bestätigungsmeldung, die in etwa so aussieht:

    INFO     2016-04-12 21:33:35,446 api_server.py:205] Starting API server at: http://localhost:36884
    INFO     2016-04-12 21:33:35,449 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
    INFO     2016-04-12 21:33:35,449 admin_server.py:116] Starting admin server at: http://localhost:8000
    
  3. Rufen Sie diese URL in Ihrem Browser auf:

    http://localhost:8080/

    Die Anwendung wird beim Laden der Seite ausgeführt. Über die Ausgabe des Browsers wird angezeigt, was ausgeführt wurde. Sie erhalten folgende Ausgabe:

    Hello_Storage

  4. Beenden Sie den Entwicklungsserver, indem Sie Strg+C drücken.

Anleitung zu app.yaml

Die Datei app.yaml enthält Details zur Anwendungskonfiguration:

runtime: python27
api_version: 1
threadsafe: yes

env_variables:

handlers:
- url: /blobstore.*
  script: blobstore.app

- url: /.*
  script: main.app

Weitere Informationen zu den Konfigurationsoptionen in dieser Datei finden Sie in der app.yaml-Referenz.

Anleitung zu Importvorgängen

Die Datei main.py enthält die typischen Importe für den Zugriff auf Cloud Storage über die Clientbibliothek:

import os

import cloudstorage
from google.appengine.api import app_identity

import webapp2

Sie benötigen das Modul os und die API app_identity, damit Sie bei der Ausführung den Namen des Standard-Buckets erhalten. Sie benötigen diesen Bucket-Namen für den Cloud Storage-Zugriff.

Das Beispiel verwendet auch das Web-Framework webapp2.

Cloud Storage-Bucket angeben

Bevor Sie Vorgänge in Cloud Storage ausführen können, müssen Sie den Bucket-Namen angeben. Der einfachste Weg dafür ist die Verwendung des Standard-Buckets für Ihr Projekt. Dieser kann folgendermaßen abgerufen werden:

def get(self):
    bucket_name = os.environ.get(
        'BUCKET_NAME', app_identity.get_default_gcs_bucket_name())

    self.response.headers['Content-Type'] = 'text/plain'
    self.response.write(
        'Demo GCS Application running from Version: {}\n'.format(
            os.environ['CURRENT_VERSION_ID']))
    self.response.write('Using bucket name: {}\n\n'.format(bucket_name))

Datei in Cloud Storage schreiben

Im folgenden Beispiel wird gezeigt, wie in den Bucket geschrieben wird:

def create_file(self, filename):
    """Create a file."""

    self.response.write('Creating file {}\n'.format(filename))

    # The retry_params specified in the open call will override the default
    # retry params for this particular file handle.
    write_retry_params = cloudstorage.RetryParams(backoff_factor=1.1)
    with cloudstorage.open(
        filename, 'w', content_type='text/plain', options={
            'x-goog-meta-foo': 'foo', 'x-goog-meta-bar': 'bar'},
            retry_params=write_retry_params) as cloudstorage_file:
                cloudstorage_file.write('abcde\n')
                cloudstorage_file.write('f'*1024*4 + '\n')
    self.tmp_filenames_to_clean_up.append(filename)

Beachten Sie Folgendes: Im Beispiel werden beim open-Aufruf der Datei zum Schreiben bestimmte Cloud Storage-Header angegeben, die benutzerdefinierte Metadaten für die Datei festlegen. Diese Metadaten können mit cloudstorage.stat abgerufen werden. Eine Liste der verfügbaren Header finden Sie in der Referenz zu cloudstorage.open.

Beachten Sie auch, dass der Header x-goog-acl nicht festgelegt wird. Das bedeutet, dass das standardmäßige Cloud Storage-ACL des öffentlichen Lesezugriffs beim Schreiben in den Bucket auf das Objekt angewendet wird.

Achten Sie außerdem auf den Aufruf von close für die Datei, nachdem der Schreibvorgang abgeschlossen ist. Ohne diesen Aufruf wird die Datei nicht in Cloud Storage geschrieben. Nach dem Aufrufen von close ist das Anhängen an die Datei nicht möglich. Wenn Sie eine Datei ändern möchten, müssen Sie die Datei im Schreibmodus noch einmal öffnen. Dadurch wird sie überschrieben und nicht angehängt.

Datei aus Cloud Storage lesen

Im folgenden Beispiel wird gezeigt, wie eine Datei aus dem Bucket gelesen wird:

def read_file(self, filename):
    self.response.write(
        'Abbreviated file content (first line and last 1K):\n')

    with cloudstorage.open(filename) as cloudstorage_file:
        self.response.write(cloudstorage_file.readline())
        cloudstorage_file.seek(-1024, os.SEEK_END)
        self.response.write(cloudstorage_file.read())

Das Beispiel zeigt, wie ausgewählte Zeilen aus der gelesenen Datei angezeigt werden, in diesem Fall die öffnende Zeile und die letzten 1K-Zeilen mithilfe von seek.

Beachten Sie, dass im obigen Code kein Modus angegeben ist, wenn die Datei zum Lesen geöffnet wird. Der Standardwert für open ist der schreibgeschützte Modus.

Bucket-Inhalt auflisten

Dieser Beispielcode zeigt, wie Sie bei einem Bucket mit vielen Dateien mit den Parametern marker und max_keys durch eine Liste mit Inhalten des Buckets blättern können:

def list_bucket(self, bucket):
    """Create several files and paginate through them."""

    self.response.write('Listbucket result:\n')

    # Production apps should set page_size to a practical value.
    page_size = 1
    stats = cloudstorage.listbucket(bucket + '/foo', max_keys=page_size)
    while True:
        count = 0
        for stat in stats:
            count += 1
            self.response.write(repr(stat))
            self.response.write('\n')

        if count != page_size or count == 0:
            break
        stats = cloudstorage.listbucket(
            bucket + '/foo', max_keys=page_size, marker=stat.filename)

Beachten Sie, dass der vollständige Dateiname als eine Zeichenfolge ohne Verzeichnistrennzeichen angezeigt wird. Wenn Sie die Datei mit einer besser erkennbaren Verzeichnishierarchie ansehen möchten, setzen Sie den Parameter delimiter auf das Verzeichnistrennzeichen, das Sie verwenden möchten.

Dateien löschen

Im Codebeispiel wird das Löschen von Dateien dargestellt, in diesem Fall das Löschen aller Dateien, die während des Ausführens der Anwendung hinzugefügt wurden. In Ihrem Code würden Sie nicht so vorgehen, dies soll in diesem Beispiel nur zur Bereinigung dienen.

def delete_files(self):
    self.response.write('Deleting files...\n')
    for filename in self.tmp_filenames_to_clean_up:
        self.response.write('Deleting file {}\n'.format(filename))
        try:
            cloudstorage.delete(filename)
        except cloudstorage.NotFoundError:
            pass

Das Beispiel bereitstellen

Das Beispiel in App Engine bereitstellen und ausführen:

  1. Laden Sie die Beispielanwendung hoch, indem Sie den folgenden Befehl aus dem Verzeichnis python-docs-samples/appengine/standard/storage/appengine-client ausführen, in dem sich die Datei app.yaml befindet.

    gcloud app deploy
    

    Optionale Flags:

    • Verwenden Sie das Flag --project, um eine andere GCP Console-Projekt-ID als jene anzugeben, die Sie im gcloud-Tool als Standard initialisiert haben. Beispiel: --project [YOUR_PROJECT_ID]
    • Verwenden Sie das Flag -v, um eine Versions-ID festzulegen, andernfalls wird eine neue erstellt. Beispiel: -v [YOUR_VERSION_ID]

    Tipp: Wenn Sie die Versions-ID einer zuvor hochgeladenen Anwendung angeben, überschreibt Ihre Bereitstellung die vorhandene Version in App Engine. Dies ist nicht immer wünschenswert, insbesondere wenn die Version in App Engine Traffic bereitstellt. Das können Sie vermeiden, wenn Sie die neue Version der Anwendung mit einer anderen Versions-ID bereitstellen und dann den Traffic auf diese Version verschieben. Weitere Informationen zum Verschieben von Traffic finden Sie unter Traffic-Aufteilung.

  2. Nach Abschluss der Bereitstellung können Sie die Anwendung unter https://[YOUR_PROJECT_ID].appspot.com aufrufen, indem Sie den folgenden Befehl ausführen:

    gcloud app browse
    

    Die demo-Anwendung wird beim Laden der Seite genau wie bei der lokalen Ausführung ausgeführt. Jetzt schreibt und liest die Anwendung jedoch tatsächlich aus dem Cloud Storage-Bucket.

Weitere Informationen zum Bereitstellen der Anwendung über die Befehlszeile finden Sie unter Python 2-Anwendung bereitstellen.

Nächste Schritte

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

App Engine-Standardumgebung für Python 2