Pub/Sub-Nachrichten schreiben und beantworten

Regions-ID

REGION_ID ist ein abgekürzter Code, den Google anhand der Region zuweist, die Sie beim Erstellen Ihrer Anwendung ausgewählt haben. Der Code bezieht sich nicht auf ein Land oder eine Provinz, auch wenn einige Regions-IDs häufig verwendeten Länder- und Provinzcodes ähneln können. Bei Anwendungen, die nach Februar 2020 erstellt wurden, ist REGION_ID.r in den App Engine-URLs enthalten. Bei Anwendungen, die vor diesem Datum erstellt wurden, ist die Regions-ID in der URL optional.

Hier finden Sie weitere Informationen zu Regions-IDs.

Pub/Sub bietet zuverlässiges und asynchrones m:n-Messaging zwischen Anwendungen. Publisher-Anwendungen können Nachrichten an ein bestimmtes Thema senden. Andere Anwendungen haben die Möglichkeit, dieses Thema zu abonnieren, um Nachrichten dazu zu erhalten.

In diesem Dokument wird beschrieben, wie Sie mit der Cloud-Clientbibliothek Pub/Sub-Nachrichten in einer Python-Anwendung senden und empfangen.

Vorbereitung

  • Folgen Sie der Anleitung unter "Hello, World!" für Python in App Engine, um Ihre Umgebung und Ihr Projekt einzurichten und um mehr über die Strukturierung von Python-Anwendungen in App Engine zu erfahren.
  • Notieren Sie sich Ihre Projekt-ID und bewahren Sie sie auf. Sie benötigen die ID zur Ausführung der in diesem Dokument beschriebenen Beispielanwendung.

    Beispielanwendung klonen

    Kopieren Sie die Beispielanwendungen auf Ihren lokalen Computer und rufen Sie das Verzeichnis pubsub auf:

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples
    cd python-docs-samples/appengine/flexible/pubsub
    

    Thema und Abo erstellen

    Erstellen Sie ein Thema und ein Abo, einschließlich des Endpunkts, an den der Pub/Sub-Server Anfragen senden soll:

    gcloud pubsub topics create YOUR_TOPIC_NAME
    gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
        --topic YOUR_TOPIC_NAME \
        --push-endpoint \
        https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/pubsub/push?token=YOUR_TOKEN \
        --ack-deadline 10
    

    Ersetzen Sie YOUR_TOKEN durch ein geheimes, zufälliges Token. Der Push-Endpunkt verwendet dieses zum Verifizieren von Anfragen.

    Umgebungsvariablen festlegen

    Legen Sie in der Datei app.yaml die Umgebungsvariablen für die Projekt-ID, das Thema und das Bestätigungstoken fest:

    env_variables:
        PUBSUB_TOPIC: your-topic
        # This token is used to verify that requests originate from your
        # application. It can be any sufficiently random string.
        PUBSUB_VERIFICATION_TOKEN: 1234abc

    Codeüberprüfung

    Die Beispielanwendung verwendet die Cloud-Clientbibliotheken.

    Die Beispielanwendung verwendet die in der Datei app.yaml festgelegten Werte zum Konfigurieren von Umgebungsvariablen. Anhand dieser Werte bestätigt der Push-Anfragen-Handler, dass die Anfrage von Pub/Sub kommt und aus einer vertrauenswürdigen Quelle stammt:

    app.config['PUBSUB_VERIFICATION_TOKEN'] = \
        os.environ['PUBSUB_VERIFICATION_TOKEN']
    app.config['PUBSUB_TOPIC'] = os.environ['PUBSUB_TOPIC']
    

    Die Beispielanwendung verwaltet eine globale Liste zum Speichern der von dieser Instanz empfangenen Nachrichten:

    MESSAGES = []
    
    Die Methode pubsub_push() empfängt Push-Nachrichten und fügt sie der globalen Liste MESSAGES hinzu:

    @app.route('/pubsub/push', methods=['POST'])
    def pubsub_push():
        if (request.args.get('token', '') !=
                current_app.config['PUBSUB_VERIFICATION_TOKEN']):
            return 'Invalid request', 400
    
        envelope = json.loads(request.data.decode('utf-8'))
        payload = base64.b64decode(envelope['message']['data'])
    
        MESSAGES.append(payload)
    
        # Returning any 2xx status indicates successful receipt of the message.
        return 'OK', 200

    Die Methode index() interagiert mit der App Engine-Webanwendung, um neue Nachrichten zu veröffentlichen und empfangene Nachrichten anzuzeigen:

    @app.route('/', methods=['GET', 'POST'])
    def index():
        if request.method == 'GET':
            return render_template('index.html', messages=MESSAGES)
    
        data = request.form.get('payload', 'Example payload').encode('utf-8')
    
        # publisher = pubsub_v1.PublisherClient()
        topic_path = publisher.topic_path(
            current_app.config['PROJECT'],
            current_app.config['PUBSUB_TOPIC'])
    
        publisher.publish(topic_path, data=data)
    
        return 'OK', 200

    Beispiel lokal ausführen

    Bei einer lokalen Ausführung können Sie mit der Google Cloud CLI eine Authentifizierung für die Nutzung von Google Cloud APIs bereitstellen. Wenn Sie Ihre Umgebung wie unter Voraussetzungen beschrieben eingerichtet haben, wurde der gcloud init-Befehl zur Bereitstellung dieser Authentifizierung bereits ausgeführt.

    Installieren Sie Abhängigkeiten, vorzugsweise in einer virtuellen Umgebung.

    Mac OS/Linux

    1. Erstellen Sie eine isolierte Python-Umgebung:
      python3 -m venv env
      source env/bin/activate
    2. Wenn Sie sich nicht in dem Verzeichnis befinden, das den Beispielcode enthält, wechseln Sie zu dem Verzeichnis, das den Beispielcode hello_world enthält: Installieren Sie dann Abhängigkeiten:
      cd YOUR_SAMPLE_CODE_DIR
      pip install -r requirements.txt

    Windows

    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. Erstellen Sie eine isolierte Python-Umgebung.
      python -m venv env
      .\env\Scripts\activate
    4. Gehen Sie zu Ihrem Projektverzeichnis und installieren Sie die Abhängigkeiten: Wenn Sie sich nicht in dem Verzeichnis befinden, das den Beispielcode enthält, wechseln Sie zum Verzeichnis mit dem Beispielcode hello_world. Installieren Sie dann Abhängigkeiten:
      cd YOUR_SAMPLE_CODE_DIR
      pip install -r requirements.txt

    Legen Sie vor dem Starten Ihrer Anwendung Umgebungsvariablen fest:

    export GOOGLE_CLOUD_PROJECT=[your-project-id]
    export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
    export PUBSUB_TOPIC=[your-topic]
    python main.py
    

    Push-Benachrichtigungen simulieren

    Die Anwendung kann Nachrichten lokal senden, aber keine Push-Nachrichten lokal empfangen. Sie können jedoch eine Push-Nachricht simulieren, wenn Sie eine HTTP-Anfrage an den lokalen Push-Benachrichtigungsendpunkt senden. Das Beispiel enthält die Datei sample_message.json.

    Sie verwenden curl oder einen httpie-Client, um eine HTTP-Anfrage vom Typ POST zu senden:

    curl -i --data @sample_message.json "localhost:8080/push-handlers/receive_messages?token=[your-token]"
    

    Oder

    http POST ":8080/push-handlers/receive_messages?token=[your-token]" < sample_message.json
    

    Antwort

    HTTP/1.0 200 OK
    Content-Length: 2
    Content-Type: text/html; charset=utf-8
    Date: Mon, 10 Aug 2015 17:52:03 GMT
    Server: Werkzeug/0.10.4 Python/2.7.10
    
    OK
    

    Nachdem die Anfrage abgeschlossen ist, können Sie localhost:8080 aktualisieren und die Nachricht in der Liste der empfangenen Nachrichten sehen.

    In App Engine ausführen

    Führen Sie zum Bereitstellen der Demo-Anwendung in App Engine mit dem gcloud-Befehlszeilentool den folgenden Befehl in dem Verzeichnis aus, in dem sich die Datei app.yaml befindet:

    gcloud app deploy
    

    Sie können jetzt unter https://PROJECT_ID.REGION_ID.r.appspot.com auf die Anwendung zugreifen. Sie können das Formular zum Senden von Nachrichten verwenden. Dabei ist jedoch nicht sicher, welche Instanz Ihrer Anwendung die Benachrichtigung erhält. Außerdem haben Sie die Möglichkeit, mehrere Nachrichten zu senden und die Seite zu aktualisieren, damit die empfangene Nachricht angezeigt wird.