Share via


Snabbstart: Skapa en serverlös app med Azure Functions och Azure SignalR Service i Python

Kom igång med Azure SignalR Service med hjälp av Azure Functions och Python för att skapa ett serverlöst program som sänder meddelanden till klienter. Du kör funktionen i den lokala miljön och ansluter till en Azure SignalR Service-instans i molnet. Att slutföra den här snabbstarten medför en liten kostnad på några USD cent eller mindre i ditt Azure-konto.

Kommentar

Du kan hämta koden i den här artikeln från GitHub.

Förutsättningar

Den här snabbstarten kan köras på macOS, Windows eller Linux. Du behöver följande:

Förutsättning beskrivning
En Azure-prenumeration Om du inte har en Azure-prenumeration skapar du ett kostnadsfritt Azure-konto
En kodredigerare Du behöver en kodredigerare som Visual Studio Code.
Azure Functions Core Tools Kräver version 2.7.1505 eller senare för att köra Python Azure Function-appar lokalt.
Python 3.7+ Azure Functions kräver Python 3.7+. Se Python-versioner som stöds.
Azurite SignalR-bindning behöver Azure Storage. Du kan använda en lokal lagringsemulator när en funktion körs lokalt.
Azure CLI Du kan också använda Azure CLI för att skapa en Azure SignalR Service-instans.

Skapa en Azure SignalR Service-instans

I det här avsnittet skapar du en grundläggande Azure SignalR-instans som ska användas för din app. Följande steg använder Azure-portalen för att skapa en ny instans, men du kan också använda Azure CLI. Mer information finns i kommandot az signalr create i Cli-referensen för Azure SignalR Service.

  1. Logga in på Azure-portalen.
  2. Välj + Skapa en resurs längst upp till vänster på sidan.
  3. På sidan Skapa en resurs går du till textrutan tjänsten Search s och marketplace och anger signalr och väljer sedan SignalR Service i listan.
  4. På sidan SignalR Service väljer du Skapa.
  5. På fliken Grundläggande anger du viktig information för din nya SignalR Service-instans. Ange följande värden:
Fält Föreslaget värde beskrivning
Abonnemang Välj din prenumeration Välj den prenumeration som du vill använda för att skapa en ny SignalR Service-instans.
Resursgrupp Skapa en resursgrupp med namnet SignalRTestResources Välj eller skapa en resursgrupp för SignalR-resursen. Det är användbart att skapa en ny resursgrupp för den här självstudien i stället för att använda en befintlig resursgrupp. Om du vill frigöra resurser när du har slutfört självstudien tar du bort resursgruppen.

Om du tar bort en resursgrupp tas även alla resurser som tillhör gruppen bort. Det går inte att ångra den här åtgärden. Innan du tar bort en resursgrupp kontrollerar du att den inte innehåller resurser som du vill behålla.

Mer information finns i Using resource groups to manage your Azure resources (Hantera dina Azure-resurser med hjälp av resursgrupper).
Resursnamn testsignalr Ange ett unikt resursnamn för SignalR-resursen. Om testsignaler redan har tagits i din region lägger du till en siffra eller ett tecken tills namnet är unikt.

Namnet måste vara en sträng på 1 till 63 tecken och innehålla endast siffror, bokstäver och bindestreck (-). Namnet kan inte starta eller sluta med bindestreckstecknet och efterföljande bindestreck är inte giltiga.
Region Välj din region Välj lämplig region för din nya SignalR Service-instans.

Azure SignalR Service är för närvarande inte tillgängligt i alla regioner. Mer information finns i Tillgänglighet för Azure SignalR Service-regionen
Prisnivå Välj Ändra och välj sedan Kostnadsfri (endast dev/test). Välj Välj för att bekräfta ditt val av prisnivå. Azure SignalR Service har tre prisnivåer: Kostnadsfri, Standard och Premium. Självstudier använder den kostnadsfria nivån, om inget annat anges i förutsättningarna.

Mer information om funktionsskillnader mellan nivåer och priser finns i Prissättning för Azure SignalR Service
Tjänstläge Välj lämpligt tjänstläge Använd Standard när du är värd för SignalR Hub-logiken i dina webbappar och använder SignalR-tjänsten som proxy. Använd Serverlös när du använder serverlösa tekniker som Azure Functions som värd för SignalR Hub-logiken.

Klassiskt läge är endast för bakåtkompatibilitet och rekommenderas inte att använda.

Mer information finns i Tjänstläge i Azure SignalR Service.

Du behöver inte ändra inställningarna på flikarna Nätverk och Taggar för SignalR-självstudierna.

  1. Välj knappen Granska + skapa längst ned på fliken Grundläggande.
  2. På fliken Granska + skapa granskar du värdena och väljer sedan Skapa. Det tar en stund innan distributionen har slutförts.
  3. När distributionen är klar väljer du knappen Gå till resurs .
  4. På sidan SignalR-resurs väljer du Nycklar på menyn till vänster under Inställningar.
  5. Kopiera Anslut ionssträngen för primärnyckeln. Du behöver den här anslutningssträng för att konfigurera appen senare i den här självstudien.

Skapa Azure Function-projektet

Skapa ett lokalt Azure Function-projekt.

  1. Skapa en katalog för projektet från en kommandorad.
  2. Ändra till projektkatalogen.
  3. Använd Azure Functions-kommandot func init för att initiera funktionsprojektet.
# Initialize a function project
func init --worker-runtime python

Skapa funktionerna

När du har initierat ett projekt måste du skapa funktioner. Det här projektet kräver tre funktioner:

  • index: Är värd för en webbsida för en klient.
  • negotiate: Tillåter att en klient hämtar en åtkomsttoken.
  • broadcast: Använder en tidsutlösare för att regelbundet sända meddelanden till alla klienter.

När du kör func new kommandot från projektets rotkatalog lägger Azure Functions Core Tools till funktionskoden i function_app.py filen. Du redigerar parametrarnas annonsinnehåll efter behov genom att ersätta standardkoden med appkoden.

Skapa indexfunktionen

Du kan använda den här exempelfunktionen som en mall för dina egna funktioner.

Öppna function_app.py-filen. Den här filen innehåller dina funktioner. Ändra först filen så att den innehåller nödvändiga importinstruktioner och definiera globala variabler som vi ska använda i följande funktioner.

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

app = func.FunctionApp()

etag = ''
start_count = 0
  1. Lägg till funktionen index genom att lägga till följande kod
@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')

Den här funktionen är värd för en webbsida för en klient.

Skapa funktionen negotiate

Lägg till funktionen negotiate genom att lägga till följande kod

@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)

Med den här funktionen kan en klient hämta en åtkomsttoken.

Skapa en sändningsfunktion.

Lägg till funktionen broadcast genom att lägga till följande kod

@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) ]
    }))

Den här funktionen använder en tidsutlösare för att regelbundet sända meddelanden till alla klienter.

Skapa Azure Function-projektet

Skapa ett lokalt Azure Function-projekt.

  1. Skapa en katalog för projektet från en kommandorad.
  2. Ändra till projektkatalogen.
  3. Använd Azure Functions-kommandot func init för att initiera funktionsprojektet.
# Initialize a function project
func init --worker-runtime python --model v1

Skapa funktionerna

När du har initierat ett projekt måste du skapa funktioner. Det här projektet kräver tre funktioner:

  • index: Är värd för en webbsida för en klient.
  • negotiate: Tillåter att en klient hämtar en åtkomsttoken.
  • broadcast: Använder en tidsutlösare för att regelbundet sända meddelanden till alla klienter.

När du kör func new kommandot från projektets rotkatalog skapar Azure Functions Core Tools standardfiler för funktionskällan och lagrar dem i en mapp med namnet efter funktionen. Du redigerar filerna efter behov och ersätter standardkoden med appkoden.

Skapa indexfunktionen

Du kan använda den här exempelfunktionen som en mall för dina egna funktioner.

  1. Kör följande kommando för att skapa index funktionen.
func new -n index -t HttpTrigger
  1. Redigera index/function.json och ersätt innehållet med följande json-kod:
{
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}
  1. Redigera index/_init_.py och ersätt innehållet med följande kod:
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')

Skapa funktionen negotiate

  1. Kör följande kommando för att skapa negotiate funktionen.
func new -n negotiate -t HttpTrigger
  1. Redigera negotiate/function.json och ersätt innehållet med följande json-kod:
{
  "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. Redigera negotiate/_init_.py och ersätt innehållet med följande kod:
import azure.functions as func


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

Skapa en sändningsfunktion.

  1. Kör följande kommando för att skapa broadcast funktionen.
func new -n broadcast -t TimerTrigger
# install requests
pip install requests
  1. Redigera broadcast/function.json och ersätt innehållet med följande kod:
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "myTimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "*/5 * * * * *"
    },
    {
      "type": "signalR",
      "name": "signalRMessages",
      "hubName": "serverless",
      "connectionStringSetting": "AzureSignalRConnectionString",
      "direction": "out"
    }
  ]
}
  1. Redigera broadcast/_init_.py och ersätt innehållet med följande kod:
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) ]
    }))

Skapa index.html-filen

Klientgränssnittet för den här appen är en webbsida. Funktionen index läser HTML-innehåll från content/index.html-filen.

  1. Skapa en mapp med namnet content i projektrotmappen.
  2. Skapa filen content/index.html.
  3. Kopiera följande innehåll till filen content/index.html och spara det:
<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>

Lägg till SignalR Service-anslutningssträng i inställningarna för funktionsappen

Det sista steget är att ange SignalR Service-anslutningssträng i Azure Function-appinställningar.

  1. I Azure-portalen går du till den SignalR-instans som du distribuerade tidigare.

  2. Välj Nycklar för att visa anslutningssträngarna för SignalR Service-instansen.

    Skärmbild av sidan Azure SignalR-tjänstnycklar.

  3. Kopiera den primära anslutningssträng och kör kommandot:

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

Kör Azure-funktionsappen lokalt

Starta Azurite Storage-emulatorn:

azurite 

Kör Azure-funktionsappen i den lokala miljön:

func start

Kommentar

Om du ser ett fel som visar läsfel i bloblagringen kontrollerar du att inställningen "AzureWebJobsStorage" i local.settings.json-filen är inställd UseDevelopmentStorage=truepå .

När Azure-funktionen körs lokalt går du till http://localhost:7071/api/index. Sidan visar det aktuella stjärnantalet för GitHub Azure/azure-signalr-lagringsplatsen. När du spelar upp eller tar bort lagringsplatsen i GitHub visas det uppdaterade antalet med några sekunders mellanrum.

Rensa resurser

Om du inte planerar att fortsätta använda den här appen tar du bort alla resurser som skapades i snabbstarten med följande steg, så att inga kostnader uppstår:

  1. Välj Resursgrupper i Azure Portal längst till vänster och välj sedan den resursgrupp du skapat. Du kan också använda sökrutan till att hitta resursgruppen efter dess namn.

  2. Markera resursgruppen i fönstret som öppnas och klicka sedan på Ta bort resursgrupp.

  3. I det nya fönstret skriver du namnet på resursgruppen som ska tas bort. Klicka sedan på Ta bort.

Har du problem? Prova felsökningsguiden eller meddela oss.

Nästa steg

I den här snabbstarten skapade och körde du ett serverlöst realtidsprogram lokalt. Läs sedan mer om hur du använder dubbelriktad kommunikation mellan klienter och Azure Function med SignalR Service.