Rychlý start: Vytvoření bezserverové aplikace pomocí Azure Functions a služby Azure SignalR v Pythonu

Začněte se službou Azure SignalR Service pomocí Azure Functions a Pythonu k vytvoření bezserverové aplikace, která vysílá zprávy klientům. Funkci spustíte v místním prostředí a připojíte se k instanci služby Azure SignalR v cloudu. Dokončením tohoto rychlého startu se v účtu Azure zobrazí malé náklady na několik centů USD nebo méně.

Poznámka:

Kód v tomto článku můžete získat z GitHubu.

Požadavky

Toto Rychlé zprovoznění je možné spustit v systémech macOS, Windows nebo Linux. Budete potřebovat následující:

Požadavek Popis
Předplatné Azure Pokud nemáte předplatné Azure, vytvořte si bezplatný účet Azure.
Editor kódu Budete potřebovat editor kódu, jako je Visual Studio Code.
Azure Functions Core Tools K místnímu spouštění aplikací Azure Functions v Pythonu vyžaduje verzi 2.7.1505 nebo vyšší.
Python 3.7 nebo novější Azure Functions vyžaduje Python 3.7 nebo novější. Viz podporované verze Pythonu.
Azurite Vazba SignalR vyžaduje Službu Azure Storage. Emulátor místního úložiště můžete použít, když je funkce spuštěná místně.
Azure CLI Volitelně můžete pomocí Azure CLI vytvořit instanci služby Azure SignalR.

Vytvoření instance služby Azure SignalR Service

V této části vytvoříte základní instanci Azure SignalR, která se použije pro vaši aplikaci. Následující kroky používají azure Portal k vytvoření nové instance, ale můžete také použít Azure CLI. Další informace najdete v tématu az signalr create command in the Azure SignalR Service CLI Reference.

  1. Přihlaste se k portálu Azure.
  2. V levém horním rohu stránky vyberte + Vytvořit prostředek.
  3. Na stránce Vytvořit prostředek v textovém poli Search s a marketplace zadejte signalr a ze seznamu vyberte Službu SignalR.
  4. Na stránce Služby SignalR vyberte Vytvořit.
  5. Na kartě Základy zadáte základní informace pro novou instanci služby SignalR. Zadejte následující hodnoty:
Pole Navrhovaná hodnota Popis
Předplatné Zvolte si předplatné. Vyberte předplatné, které chcete použít k vytvoření nové instance služby SignalR.
Skupina prostředků Vytvoření skupiny prostředků s názvem SignalRTestResources Vyberte nebo vytvořte skupinu prostředků pro prostředek služby SignalR. Místo použití existující skupiny prostředků je užitečné vytvořit novou skupinu prostředků pro účely tohoto kurzu. Pokud chcete po dokončení kurzu uvolnit prostředky, odstraňte skupinu prostředků.

Odstraněním skupiny prostředků se odstraní také všechny prostředky, které patří do skupiny. Tuto akci nelze vrátit zpět. Před odstraněním skupiny prostředků se ujistěte, že neobsahuje prostředky, které chcete zachovat.

Další informace najdete v článku Použití skupin prostředků ke správě prostředků Azure.
Název prostředku testsignalr Zadejte jedinečný název prostředku, který se použije pro prostředek služby SignalR. Pokud je testsignalr už ve vaší oblasti pořízený, přidejte číslici nebo znak, dokud nebude název jedinečný.

Název musí být řetězec 1 až 63 znaků a musí obsahovat jenom číslice, písmena a pomlčka (-). Název nemůže začínat ani končit znakem spojovníku a po sobě jdoucí znaky spojovníku nejsou platné.
Oblast Vyberte vaši oblast Vyberte příslušnou oblast pro novou instanci služby SignalR.

Služba Azure SignalR není v současné době dostupná ve všech oblastech. Další informace najdete v tématu Dostupnost oblasti služby Azure SignalR Service.
Cenová úroveň Vyberte Změnit a pak zvolte Free (pouze vývoj/testování). Zvolením možnosti Vybrat potvrďte svou volbu cenové úrovně. Služba Azure SignalR má tři cenové úrovně: Free, Standard a Premium. Kurzy používají úroveň Free , pokud není uvedeno jinak v požadavcích.

Další informace o rozdílech funkcí mezi úrovněmi a cenami najdete v tématu Ceny služby Azure SignalR.
Režim služby Volba příslušného režimu služby Použití výchozího nastavení při hostování logiky centra SignalR ve webových aplikacích a použití služby SignalR jako proxy serveru. Bezserverové použití bezserverových technologií, jako je Azure Functions, k hostování logiky centra SignalR.

Klasický režim je pouze kvůli zpětné kompatibilitě a nedoporučuje se používat.

Další informace najdete v tématu Režim služby ve službě Azure SignalR.

V kurzech SignalR nemusíte měnit nastavení na kartách Sítě a značky .

  1. Vyberte tlačítko Zkontrolovat a vytvořit v dolní části karty Základy.
  2. Na kartě Zkontrolovat a vytvořit zkontrolujte hodnoty a pak vyberte Vytvořit. Dokončení nasazení chvíli trvá.
  3. Po dokončení nasazení vyberte tlačítko Přejít k prostředku .
  4. Na stránce prostředku SignalR vyberte v nabídce na levé straně v části Nastavení.
  5. Zkopírujte řetězec Připojení ion pro primární klíč. Tuto připojovací řetězec budete potřebovat ke konfiguraci aplikace později v tomto kurzu.

Vytvoření projektu funkce Azure Functions

Vytvořte místní projekt funkce Azure Functions.

  1. Z příkazového řádku vytvořte adresář pro projekt.
  2. Přejděte do adresáře projektu.
  3. K inicializaci projektu funkce použijte příkaz Azure Functions func init .
# Initialize a function project
func init --worker-runtime python

Vytvoření funkcí

Po inicializaci projektu je potřeba vytvořit funkce. Tento projekt vyžaduje tři funkce:

  • index: Hostuje webovou stránku klienta.
  • negotiate: Umožňuje klientovi získat přístupový token.
  • broadcast: Používá aktivační událost času k pravidelnému vysílání zpráv všem klientům.

Když spustíte func new příkaz z kořenového adresáře projektu, azure Functions Core Tools připojí kód funkce do function_app.py souboru. Podle potřeby upravíte obsah reklam parametrů tak, že nahradíte výchozí kód kódem aplikace.

Vytvoření indexové funkce

Tuto ukázkovou funkci můžete použít jako šablonu pro vlastní funkce.

Otevřete soubor function_app.py. Tento soubor bude obsahovat vaše funkce. Nejprve upravte soubor tak, aby zahrnoval nezbytné příkazy importu, a definujte globální proměnné, které budeme používat v následujících funkcích.

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

app = func.FunctionApp()

etag = ''
start_count = 0
  1. Přidejte funkci index přidáním následujícího kódu.
@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')

Tato funkce hostuje webovou stránku klienta.

Vytvoření funkce negotiate

Přidejte funkci negotiate přidáním následujícího kódu.

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

Tato funkce umožňuje klientovi získat přístupový token.

Vytvořte funkci všesměrového vysílání.

Přidejte funkci broadcast přidáním následujícího kódu.

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

Tato funkce používá aktivační událost času k pravidelnému vysílání zpráv všem klientům.

Vytvoření projektu funkce Azure Functions

Vytvořte místní projekt funkce Azure Functions.

  1. Z příkazového řádku vytvořte adresář pro projekt.
  2. Přejděte do adresáře projektu.
  3. K inicializaci projektu funkce použijte příkaz Azure Functions func init .
# Initialize a function project
func init --worker-runtime python --model v1

Vytvoření funkcí

Po inicializaci projektu je potřeba vytvořit funkce. Tento projekt vyžaduje tři funkce:

  • index: Hostuje webovou stránku klienta.
  • negotiate: Umožňuje klientovi získat přístupový token.
  • broadcast: Používá aktivační událost času k pravidelnému vysílání zpráv všem klientům.

Když spustíte func new příkaz z kořenového adresáře projektu, Azure Functions Core Tools vytvoří výchozí zdrojové soubory funkcí a uloží je do složky pojmenované po funkci. Soubory upravíte podle potřeby a nahradíte výchozí kód kódem aplikace.

Vytvoření indexové funkce

Tuto ukázkovou funkci můžete použít jako šablonu pro vlastní funkce.

  1. Spuštěním následujícího příkazu vytvořte index funkci.
func new -n index -t HttpTrigger
  1. Upravte index/function.json a nahraďte obsah následujícím kódem JSON:
{
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}
  1. Upravte index/_init_.py a nahraďte obsah následujícím kódem:
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')

Vytvoření funkce negotiate

  1. Spuštěním následujícího příkazu vytvořte negotiate funkci.
func new -n negotiate -t HttpTrigger
  1. Upravte negotiate/function.json a nahraďte obsah následujícím kódem JSON:
{
  "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. Upravte negotiate/_init_.py a nahraďte obsah následujícím kódem:
import azure.functions as func


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

Vytvořte funkci všesměrového vysílání.

  1. Spuštěním následujícího příkazu vytvořte broadcast funkci.
func new -n broadcast -t TimerTrigger
# install requests
pip install requests
  1. Upravte všesměrové vysílání/function.json a nahraďte obsah následujícím kódem:
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "myTimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "*/5 * * * * *"
    },
    {
      "type": "signalR",
      "name": "signalRMessages",
      "hubName": "serverless",
      "connectionStringSetting": "AzureSignalRConnectionString",
      "direction": "out"
    }
  ]
}
  1. Upravte broadcast/_init_.py a nahraďte obsah následujícím kódem:
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) ]
    }))

Vytvoření souboru index.html

Klientské rozhraní této aplikace je webová stránka. Funkce index čte obsah HTML ze souboru content/index.html .

  1. Vytvořte složku s názvem content v kořenové složce projektu.
  2. Vytvořte soubor content/index.html.
  3. Zkopírujte následující obsah do souboru content/index.html a uložte ho:
<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>

Přidání připojovací řetězec služby SignalR do nastavení aplikace funkcí

Posledním krokem je nastavení služby SignalR Service připojovací řetězec v nastavení aplikace funkcí Azure.

  1. Na webu Azure Portal přejděte do instance SignalR, kterou jste nasadili dříve.

  2. Výběrem možnosti Klíče zobrazte připojovací řetězce instance služby SignalR.

    Snímek obrazovky se stránkou Klíče služby Azure SignalR

  3. Zkopírujte primární připojovací řetězec a spusťte příkaz:

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

Místní spuštění aplikace Funkcí Azure

Spusťte emulátor úložiště Azurite:

azurite 

Spusťte aplikaci Funkcí Azure v místním prostředí:

func start

Poznámka:

Pokud se v úložišti objektů blob zobrazí chyby čtení, ujistěte se, že je nastavení AzureWebJobsStorage v souboru local.settings.json nastavené na UseDevelopmentStorage=truehodnotu .

Po místním spuštění funkce Azure Functions přejděte na http://localhost:7071/api/index. Na stránce se zobrazí aktuální počet hvězdiček pro úložiště Azure/azure-signalr GitHubu. Když aktualizujete nebo zrušíte hvězdu úložiště na GitHubu, zobrazí se počet aktualizací každých několik sekund.

Vyčištění prostředků

Pokud nebudete tuto aplikace nadále používat, odstraňte na základě následujícího postupu všechny prostředky vytvořené podle tohoto rychlého startu, aby se vám neúčtovaly žádné poplatky:

  1. Úplně nalevo na webu Azure Portal vyberte Skupiny prostředků a pak vyberte skupinu prostředků, kterou jste vytvořili. Případně můžete použít vyhledávací pole a skupinu prostředků vyhledat podle jejího názvu.

  2. V okně, které se otevře, vyberte příslušnou skupinu prostředků a pak klikněte na Odstranit skupinu prostředků.

  3. V novém okně zadejte název skupiny prostředků, kterou chcete odstranit, a pak klikněte na Odstranit.

Máte problémy? Vyzkoušejte průvodce odstraňováním potíží nebo nám dejte vědět.

Další kroky

V tomto rychlém startu jste vytvořili a spustili bezserverovou aplikaci v reálném čase v místním prostředí. V dalším kroku se dozvíte, jak používat obousměrnou komunikaci mezi klienty a funkcí Azure Functions se službou SignalR.