Share via


Quickstart: Een serverloze app maken met Azure Functions en Azure SignalR Service in Python

Ga aan de slag met Azure SignalR Service met behulp van Azure Functions en Python om een serverloze toepassing te bouwen waarmee berichten naar clients worden uitgezonden. U voert de functie uit in de lokale omgeving en maakt verbinding met een Azure SignalR Service-exemplaar in de cloud. Voor het voltooien van deze quickstart worden een kleine kosten van een paar cent of minder in uw Azure-account in rekening gebracht.

Notitie

U kunt de code in dit artikel ophalen uit GitHub.

Vereisten

Deze quickstart kan worden uitgevoerd op macOS, Windows of Linux. U hebt het volgende nodig:

Vereiste Beschrijving
Een Azure-abonnement Als u geen Azure-abonnement hebt, maakt u een gratis Azure-account
Een code-editor U hebt een code-editor nodig, zoals Visual Studio Code.
Azure Functions Core Tools Vereist versie 2.7.1505 of hoger om Python Azure Function-apps lokaal uit te voeren.
Python 3.7+ Voor Azure Functions is Python 3.7+ vereist. Zie ondersteunde Python-versies.
Azuriet SignalR-binding heeft Azure Storage nodig. U kunt een lokale opslagemulator gebruiken wanneer een functie lokaal wordt uitgevoerd.
Azure-CLI U kunt eventueel de Azure CLI gebruiken om een Azure SignalR Service-exemplaar te maken.

Een Azure SignalR Service-exemplaar maken

In deze sectie maakt u een azure SignalR-basisexemplaren die u voor uw app kunt gebruiken. In de volgende stappen wordt Azure Portal gebruikt om een nieuw exemplaar te maken, maar u kunt ook de Azure CLI gebruiken. Zie de opdracht az signalr create in de Naslaginformatie over azure SignalR Service CLI voor meer informatie.

  1. Meld u aan bij het Azure-portaal.
  2. Selecteer in de linkerbovenhoek van de pagina + Een resource maken.
  3. Voer op de pagina Een resource maken in het tekstvak Search-service s en Marketplace signalr in en selecteer vervolgens SignalR Service in de lijst.
  4. Selecteer Maken op de pagina SignalR Service.
  5. Voer op het tabblad Basisinformatie de essentiële informatie in voor uw nieuwe SignalR Service-exemplaar. Voer de volgende waarden in:
Veld Voorgestelde waarde Beschrijving
Abonnement Kies uw abonnement Selecteer het abonnement dat u wilt gebruiken om een nieuw SignalR Service-exemplaar te maken.
Resourcegroep Maak een resourcegroep met de naam SignalRTestResources Selecteer of maak een resourcegroep voor uw SignalR-resource. Het is handig om een nieuwe resourcegroep te maken voor deze zelfstudie in plaats van een bestaande resourcegroep te gebruiken. Als u resources wilt vrijmaken nadat u de zelfstudie hebt voltooid, verwijdert u de resourcegroep.

Als u een resourcegroep verwijdert, worden ook alle resources verwijderd die deel uitmaken van de groep. Deze actie kan niet ongedaan worden gemaakt. Voordat u een resourcegroep verwijdert, moet u ervoor zorgen dat deze geen resources bevat die u wilt behouden.

Zie Resourcegroepen gebruiken om Azure-resources te beheren voor meer informatie.
Resourcenaam testsignalr Voer een unieke resourcenaam in voor de SignalR-resource. Als testsignalr al in uw regio wordt gebruikt, voegt u een cijfer of teken toe totdat de naam uniek is.

De naam moet een tekenreeks zijn van 1 tot 63 tekens die alleen cijfers, letters en het koppelteken (-) mag bevatten. De naam kan niet beginnen of eindigen met het afbreekstreepje en opeenvolgende afbreekstreepjes zijn niet geldig.
Regio Uw regio kiezen Selecteer de juiste regio voor uw nieuwe SignalR Service-exemplaar.

Azure SignalR Service is momenteel niet beschikbaar in alle regio's. Zie beschikbaarheid van azure SignalR-serviceregio's voor meer informatie
Prijscategorie Selecteer Wijzigen en kies vervolgens Gratis (alleen dev/test). Kies Selecteren om uw keuze in de prijscategorie te bevestigen. Azure SignalR Service heeft drie prijscategorieën: Gratis, Standard en Premium. Zelfstudies gebruiken de gratis laag, tenzij anders vermeld in de vereisten.

Zie prijzen voor Azure SignalR Service voor meer informatie over de verschillen in functionaliteit tussen lagen en prijzen
Servicemodus De juiste servicemodus kiezen Gebruik standaard wanneer u de Logica van de SignalR-hub in uw web-apps host en SignalR-service als proxy gebruikt. Gebruik serverloos wanneer u serverloze technologieën zoals Azure Functions gebruikt om de SignalR-hublogica te hosten.

Klassieke modus is alleen bedoeld voor compatibiliteit met eerdere versies en wordt niet aanbevolen om te gebruiken.

Zie de servicemodus in Azure SignalR Service voor meer informatie.

U hoeft de instellingen niet te wijzigen op de tabbladen Netwerken en tags voor de SignalR-zelfstudies.

  1. Selecteer de knop Beoordelen en maken onder aan het tabblad Basisbeginselen .
  2. Controleer op het tabblad Beoordelen en maken de waarden en selecteer Vervolgens Maken. Het duurt even voordat de implementatie is voltooid.
  3. Wanneer de implementatie is voltooid, selecteert u de knop Ga naar resource .
  4. Selecteer op de pagina SignalR-resource sleutels in het menu aan de linkerkant, onder Instellingen.
  5. Kopieer de Verbinding maken iontekenreeks voor de primaire sleutel. U hebt deze verbindingsreeks nodig om uw app verderop in deze zelfstudie te configureren.

Het Azure Function-project maken

Maak een lokaal Azure Function-project.

  1. Maak vanaf een opdrachtregel een map voor uw project.
  2. Ga naar de projectmap.
  3. Gebruik de Azure Functions-opdracht func init om uw functieproject te initialiseren.
# Initialize a function project
func init --worker-runtime python

De functies maken

Nadat u een project hebt geïnitialiseerd, moet u functies maken. Voor dit project zijn drie functies vereist:

  • index: fungeert als host voor een webpagina voor een client.
  • negotiate: Hiermee kan een client een toegangstoken ophalen.
  • broadcast: Gebruikt een tijdtrigger om periodiek berichten uit te zenden naar alle clients.

Wanneer u de func new opdracht uitvoert vanuit de hoofdmap van het project, voegt de Azure Functions Core Tools de functiecode toe aan het function_app.py bestand. U bewerkt de ad-inhoud van de parameters indien nodig door de standaardcode te vervangen door de app-code.

De indexfunctie maken

U kunt deze voorbeeldfunctie gebruiken als sjabloon voor uw eigen functies.

Open het bestand function_app.py. Dit bestand bevat uw functies. Pas eerst het bestand aan om de benodigde importinstructies op te nemen en definieer globale variabelen die we in de volgende functies gaan gebruiken.

import azure.functions as func
import os
import requests
import json 

app = func.FunctionApp()

etag = ''
start_count = 0
  1. Voeg de functie index toe door de volgende code toe te voegen
@app.route(route="index", auth_level=func.AuthLevel.ANONYMOUS)
def index(req: func.HttpRequest) -> func.HttpResponse:
    f = open(os.path.dirname(os.path.realpath(__file__)) + '/content/index.html')
    return func.HttpResponse(f.read(), mimetype='text/html')

Deze functie fungeert als host voor een webpagina voor een client.

De onderhandelingsfunctie maken

Voeg de functie negotiate toe door de volgende code toe te voegen

@app.route(route="negotiate", auth_level=func.AuthLevel.ANONYMOUS, methods=["POST"])
@app.generic_input_binding(arg_name="connectionInfo", type="signalRConnectionInfo", hubName="serverless", connectionStringSetting="AzureSignalRConnectionString")
def negotiate(req: func.HttpRequest, connectionInfo) -> func.HttpResponse:
    return func.HttpResponse(connectionInfo)

Met deze functie kan een client een toegangstoken ophalen.

Maak een broadcast-functie.

Voeg de functie broadcast toe door de volgende code toe te voegen

@app.timer_trigger(schedule="*/1 * * * *", arg_name="myTimer",
              run_on_startup=False,
              use_monitor=False)
@app.generic_output_binding(arg_name="signalRMessages", type="signalR", hubName="serverless", connectionStringSetting="AzureSignalRConnectionString")
def broadcast(myTimer: func.TimerRequest, signalRMessages: func.Out[str]) -> None:
    global etag
    global start_count
    headers = {'User-Agent': 'serverless', 'If-None-Match': etag}
    res = requests.get('https://api.github.com/repos/azure/azure-functions-python-worker', headers=headers)
    if res.headers.get('ETag'):
        etag = res.headers.get('ETag')

    if res.status_code == 200:
        jres = res.json()
        start_count = jres['stargazers_count']

    signalRMessages.set(json.dumps({
        'target': 'newMessage',
        'arguments': [ 'Current star count of https://api.github.com/repos/azure/azure-functions-python-worker is: ' + str(start_count) ]
    }))

Deze functie maakt gebruik van een tijdtrigger om periodiek berichten uit te zenden naar alle clients.

Het Azure Function-project maken

Maak een lokaal Azure Function-project.

  1. Maak vanaf een opdrachtregel een map voor uw project.
  2. Ga naar de projectmap.
  3. Gebruik de Azure Functions-opdracht func init om uw functieproject te initialiseren.
# Initialize a function project
func init --worker-runtime python --model v1

De functies maken

Nadat u een project hebt geïnitialiseerd, moet u functies maken. Voor dit project zijn drie functies vereist:

  • index: fungeert als host voor een webpagina voor een client.
  • negotiate: Hiermee kan een client een toegangstoken ophalen.
  • broadcast: Gebruikt een tijdtrigger om periodiek berichten uit te zenden naar alle clients.

Wanneer u de func new opdracht uitvoert vanuit de hoofdmap van het project, maakt de Azure Functions Core Tools standaardfunctiebronbestanden en slaat deze op in een map met de naam van de functie. U bewerkt de bestanden zo nodig door de standaardcode te vervangen door de app-code.

De indexfunctie maken

U kunt deze voorbeeldfunctie gebruiken als sjabloon voor uw eigen functies.

  1. Voer de volgende opdracht uit om de index functie te maken.
func new -n index -t HttpTrigger
  1. Index/function.json bewerken en de inhoud vervangen door de volgende json-code:
{
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}
  1. Bewerk index/_init_.py en vervang de inhoud door de volgende code:
import os

import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:
    f = open(os.path.dirname(os.path.realpath(__file__)) + '/../content/index.html')
    return func.HttpResponse(f.read(), mimetype='text/html')

De onderhandelingsfunctie maken

  1. Voer de volgende opdracht uit om de negotiate functie te maken.
func new -n negotiate -t HttpTrigger
  1. Bewerk negotiate/function.json en vervang de inhoud door de volgende json-code:
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "type": "signalRConnectionInfo",
      "name": "connectionInfo",
      "hubName": "serverless",
      "connectionStringSetting": "AzureSignalRConnectionString",
      "direction": "in"
    }
  ]
}
  1. Bewerk negotiate/_init_.py en vervang de inhoud door de volgende code:
import azure.functions as func


def main(req: func.HttpRequest, connectionInfo) -> func.HttpResponse:
    return func.HttpResponse(connectionInfo)

Maak een broadcast-functie.

  1. Voer de volgende opdracht uit om de broadcast functie te maken.
func new -n broadcast -t TimerTrigger
# install requests
pip install requests
  1. Bewerk broadcast/function.json en vervang de inhoud door de volgende code:
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "myTimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "*/5 * * * * *"
    },
    {
      "type": "signalR",
      "name": "signalRMessages",
      "hubName": "serverless",
      "connectionStringSetting": "AzureSignalRConnectionString",
      "direction": "out"
    }
  ]
}
  1. Bewerk broadcast/_init_.py en vervang de inhoud door de volgende code:
import requests
import json

import azure.functions as func

etag = ''
start_count = 0

def main(myTimer: func.TimerRequest, signalRMessages: func.Out[str]) -> None:
    global etag
    global start_count
    headers = {'User-Agent': 'serverless', 'If-None-Match': etag}
    res = requests.get('https://api.github.com/repos/azure/azure-signalr', headers=headers)
    if res.headers.get('ETag'):
        etag = res.headers.get('ETag')

    if res.status_code == 200:
        jres = res.json()
        start_count = jres['stargazers_count']

    signalRMessages.set(json.dumps({
        'target': 'newMessage',
        'arguments': [ 'Current star count of https://github.com/Azure/azure-signalr is: ' + str(start_count) ]
    }))

Het index.html-bestand maken

De clientinterface voor deze app is een webpagina. De index functie leest HTML-inhoud uit het content/index.html-bestand .

  1. Maak een map met de naam content in de hoofdmap van uw project.
  2. Maak het bestand content/index.html.
  3. Kopieer de volgende inhoud naar het content/index.html bestand en sla deze op:
<html>

<body>
  <h1>Azure SignalR Serverless Sample</h1>
  <div id="messages"></div>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/3.1.7/signalr.min.js"></script>
  <script>
    let messages = document.querySelector('#messages');
    const apiBaseUrl = window.location.origin;
    const connection = new signalR.HubConnectionBuilder()
        .withUrl(apiBaseUrl + '/api')
        .configureLogging(signalR.LogLevel.Information)
        .build();
      connection.on('newMessage', (message) => {
        document.getElementById("messages").innerHTML = message;
      });

      connection.start()
        .catch(console.error);
  </script>
</body>

</html>

De SignalR Service-verbindingsreeks toevoegen aan de instellingen van de functie-app

De laatste stap is het instellen van de SignalR Service-verbindingsreeks in de instellingen van de Azure Function-app.

  1. Ga in Azure Portal naar het SignalR-exemplaar dat u eerder hebt geïmplementeerd.

  2. Selecteer Sleutels om de verbindingsreeksen voor het service-exemplaar van SignalR weer te geven.

    Schermopname van de pagina Azure SignalR-servicesleutels.

  3. Kopieer de primaire verbindingsreeks en voer de opdracht uit:

    func settings add AzureSignalRConnectionString "<signalr-connection-string>"
    

De Azure Function-app lokaal uitvoeren

Start de Emulator van de Azurite-opslag:

azurite 

Voer de Azure Function-app uit in de lokale omgeving:

func start

Notitie

Als er fouten worden weergegeven met leesfouten in de blobopslag, controleert u of de instelling 'AzureWebJobsStorage' in het bestand local.settings.json is ingesteld op UseDevelopmentStorage=true.

Nadat de Azure-functie lokaal wordt uitgevoerd, gaat u naar http://localhost:7071/api/index. Op de pagina wordt het huidige aantal sterren weergegeven voor de GitHub Azure/azure-signalr-opslagplaats. Wanneer u de opslagplaats in GitHub start of unstart, ziet u elke paar seconden het vernieuwde aantal.

Resources opschonen

Als u deze app niet verder gaat gebruiken, kunt u alle resources verwijderen die door deze Quick Start zijn aangemaakt door de onderstaande stappen te volgen, zodat u geen kosten in rekening worden gebracht:

  1. Selecteer links in de Azure-portal de optie Resourcegroepen en selecteer vervolgens de resourcegroep die u hebt gemaakt. U kunt ook het zoekvak gebruiken om de resourcegroep op de naam te zoeken.

  2. Selecteer in het venster dat wordt geopend, de resourcegroep en klik op Resourcegroep verwijderen.

  3. Voer in het nieuwe venster de naam in van de resourcegroep die u wilt verwijderen en klik vervolgens op Verwijderen.

Ondervindt u problemen? Probeer de gids voor probleemoplossing of laat het ons weten.

Volgende stappen

In deze quickstart hebt u een serverloze toepassing in realtime gebouwd en uitgevoerd in lokaal. Lees vervolgens meer over het gebruik van bidirectionele communicatie tussen clients en Azure Function met SignalR Service.