Udostępnij za pośrednictwem


Szybki start: tworzenie aplikacji bezserwerowej za pomocą usług Azure Functions i Azure SignalR Service w języku Python

Rozpocznij pracę z usługą Azure SignalR Service przy użyciu usług Azure Functions i Python, aby utworzyć aplikację bezserwerową, która emituje komunikaty do klientów. Uruchomisz funkcję w środowisku lokalnym, łącząc się z wystąpieniem usługi Azure SignalR Service w chmurze. Ukończenie tego przewodnika Szybki start wiąże się z niewielkim kosztem co najmniej kilku centów w ramach konta platformy Azure.

Uwaga

Kod w tym artykule można pobrać z usługi GitHub.

Wymagania wstępne

Czynności przedstawione w tym przewodniku Szybki start można wykonywać w systemie macOS, Windows lub Linux. Potrzebne będą następujące elementy:

Wymaganie wstępne opis
Subskrypcja platformy Azure Jeśli nie masz subskrypcji platformy Azure, utwórz bezpłatne konto platformy Azure
Edytor kodu Będziesz potrzebować edytora kodu, takiego jak Visual Studio Code.
Azure Functions Core Tools Wymaga lokalnego uruchamiania aplikacji funkcji platformy Azure w języku Python w wersji 2.7.1505 lub nowszej.
Python 3.7+ Usługa Azure Functions wymaga języka Python w wersji 3.7 lub nowszej. Zobacz Obsługiwane wersje języka Python.
Azurite Powiązanie usługi SignalR wymaga usługi Azure Storage. Możesz użyć lokalnego emulatora magazynu, gdy funkcja jest uruchomiona lokalnie.
Interfejs wiersza polecenia platformy Azure Opcjonalnie możesz użyć interfejsu wiersza polecenia platformy Azure do utworzenia wystąpienia usługi Azure SignalR Service.

Tworzenie wystąpienia usługi Azure SignalR Service

W tej sekcji utworzysz podstawowe wystąpienie usługi Azure SignalR do użycia dla aplikacji. Poniższe kroki umożliwiają utworzenie nowego wystąpienia za pomocą witryny Azure Portal, ale można również użyć interfejsu wiersza polecenia platformy Azure. Aby uzyskać więcej informacji, zobacz polecenie az signalr create w dokumentacji interfejsu wiersza polecenia usługi Azure SignalR Service.

  1. Zaloguj się w witrynie Azure Portal.
  2. W lewym górnym rogu strony wybierz pozycję + Utwórz zasób.
  3. Na stronie Tworzenie zasobu w polu tekstowym usługa wyszukiwania s i marketplace wprowadź signalr, a następnie wybierz pozycję SignalR Service z listy.
  4. Na stronie SignalR Service wybierz pozycję Utwórz.
  5. Na karcie Podstawy wprowadź podstawowe informacje dotyczące nowego wystąpienia usługi SignalR Service. Wprowadź następujące wartości:
Pole Sugerowana wartość opis
Subskrypcja Wybierz swoją subskrypcję Wybierz subskrypcję, której chcesz użyć, aby utworzyć nowe wystąpienie usługi SignalR Service.
Grupa zasobów: Tworzenie grupy zasobów o nazwie SignalRTestResources Wybierz lub utwórz grupę zasobów dla zasobu usługi SignalR. Warto utworzyć nową grupę zasobów na potrzeby tego samouczka zamiast używać istniejącej grupy zasobów. Aby zwolnić zasoby po ukończeniu samouczka, usuń grupę zasobów.

Usunięcie grupy zasobów powoduje również usunięcie wszystkich zasobów należących do grupy. Tej akcji nie można cofnąć. Przed usunięciem grupy zasobów upewnij się, że nie zawiera ona zasobów, które chcesz zachować.

Więcej informacji można znaleźć w temacie Using resource groups to manage your Azure resources (Używanie grup zasobów do zarządzania zasobami platformy Azure).
Nazwa zasobu testsignalr Podaj unikatową nazwę zasobu do użycia dla zasobu usługi SignalR. Jeśli testsignalr jest już wykonany w Twoim regionie, dodaj cyfrę lub znak, dopóki nazwa nie będzie unikatowa.

Nazwa musi być ciągiem od 1 do 63 znaków i zawierać tylko cyfry, litery i znak łącznika (-). Nazwa nie może zaczynać ani kończyć się znakiem łącznika, a kolejne znaki łącznika są nieprawidłowe.
Region Wybierz region Wybierz odpowiedni region dla nowego wystąpienia usługi SignalR Service.

Usługa Azure SignalR Service nie jest obecnie dostępna we wszystkich regionach. Aby uzyskać więcej informacji, zobacz Dostępność regionów usługi Azure SignalR Service
Warstwa cenowa Wybierz pozycję Zmień , a następnie wybierz pozycję Bezpłatna (tylko tworzenie i testowanie). Wybierz pozycję Wybierz , aby potwierdzić wybór warstwy cenowej. Usługa Azure SignalR Service ma trzy warstwy cenowe: Bezpłatna, Standardowa i Premium. Samouczki korzystają z warstwy Bezpłatna, chyba że określono inaczej w wymaganiach wstępnych.

Aby uzyskać więcej informacji o różnicach funkcjonalności między warstwami i cenami, zobacz Cennik usługi Azure SignalR Service
Tryb usługi Wybieranie odpowiedniego trybu usługi Użyj wartości Domyślnej podczas hostowania logiki centrum SignalR w aplikacjach internetowych i używania usługi SignalR jako serwera proxy. Używaj technologii bezserwerowych , takich jak Azure Functions, do hostowania logiki centrum SignalR.

Tryb klasyczny jest przeznaczony tylko dla zgodności z poprzednimi wersjami i nie jest zalecany do użycia.

Aby uzyskać więcej informacji, zobacz Tryb usługi w usłudze Azure SignalR Service.

Nie musisz zmieniać ustawień na kartach Sieć i tagi samouczków usługi SignalR.

  1. Wybierz przycisk Przejrzyj i utwórz w dolnej części karty Podstawy.
  2. Na karcie Przeglądanie i tworzenie przejrzyj wartości, a następnie wybierz pozycję Utwórz. Ukończenie wdrożenia zajmuje kilka chwil.
  3. Po zakończeniu wdrażania wybierz przycisk Przejdź do zasobu .
  4. Na stronie zasobu usługi SignalR wybierz pozycję Klucze z menu po lewej stronie w obszarze Ustawienia.
  5. Skopiuj ciąg Połączenie ion dla klucza podstawowego. Ta parametry połączenia jest potrzebna do skonfigurowania aplikacji w dalszej części tego samouczka.

Tworzenie projektu funkcji platformy Azure

Utwórz lokalny projekt funkcji platformy Azure.

  1. W wierszu polecenia utwórz katalog dla projektu.
  2. Przejdź do katalogu projektu.
  3. Za pomocą polecenia usługi Azure Functions func init zainicjuj projekt funkcji.
# Initialize a function project
func init --worker-runtime python

Tworzenie funkcji

Po zainicjowaniu projektu należy utworzyć funkcje. Ten projekt wymaga trzech funkcji:

  • index: hostuje stronę internetową klienta.
  • negotiate: umożliwia klientowi uzyskanie tokenu dostępu.
  • broadcast: używa wyzwalacza czasu, aby okresowo emitować komunikaty do wszystkich klientów.

Po uruchomieniu func new polecenia z katalogu głównego projektu narzędzia Azure Functions Core Tools dołącza kod funkcji w function_app.py pliku. W razie potrzeby zmodyfikujesz zawartość reklam parametrów, zastępując domyślny kod kodem aplikacji.

Tworzenie funkcji indeksu

Możesz użyć tej przykładowej funkcji jako szablonu dla własnych funkcji.

Otwórz plik function_app.py. Ten plik będzie zawierać funkcje. Najpierw zmodyfikuj plik w celu uwzględnienia niezbędnych instrukcji importu i zdefiniuj zmienne globalne, których będziemy używać w następujących funkcjach.

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

app = func.FunctionApp()

etag = ''
start_count = 0
  1. Dodaj funkcję index , dodając następujący 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')

Ta funkcja hostuje stronę internetową klienta.

Tworzenie funkcji negotiate

Dodaj funkcję negotiate , dodając następujący 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)

Ta funkcja umożliwia klientowi uzyskanie tokenu dostępu.

Utwórz funkcję emisji.

Dodaj funkcję broadcast , dodając następujący 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) ]
    }))

Ta funkcja używa wyzwalacza czasu, aby okresowo emitować komunikaty do wszystkich klientów.

Tworzenie projektu funkcji platformy Azure

Utwórz lokalny projekt funkcji platformy Azure.

  1. W wierszu polecenia utwórz katalog dla projektu.
  2. Przejdź do katalogu projektu.
  3. Za pomocą polecenia usługi Azure Functions func init zainicjuj projekt funkcji.
# Initialize a function project
func init --worker-runtime python --model v1

Tworzenie funkcji

Po zainicjowaniu projektu należy utworzyć funkcje. Ten projekt wymaga trzech funkcji:

  • index: hostuje stronę internetową klienta.
  • negotiate: umożliwia klientowi uzyskanie tokenu dostępu.
  • broadcast: używa wyzwalacza czasu, aby okresowo emitować komunikaty do wszystkich klientów.

Po uruchomieniu func new polecenia z katalogu głównego projektu narzędzia Azure Functions Core Tools tworzą domyślne pliki źródłowe funkcji i przechowują je w folderze o nazwie po funkcji. W razie potrzeby zmodyfikujesz pliki, zastępując domyślny kod kodem aplikacji.

Tworzenie funkcji indeksu

Możesz użyć tej przykładowej funkcji jako szablonu dla własnych funkcji.

  1. Uruchom następujące polecenie, aby utworzyć index funkcję.
func new -n index -t HttpTrigger
  1. Edytuj indeks/function.json i zastąp zawartość następującym kodem json:
{
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}
  1. Edytuj indeks/_init_.py i zastąp zawartość następującym kodem:
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')

Tworzenie funkcji negotiate

  1. Uruchom następujące polecenie, aby utworzyć negotiate funkcję.
func new -n negotiate -t HttpTrigger
  1. Edytuj negocjacja/function.json i zastąp zawartość następującym kodem 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. Edytuj plik negotiate/_init_.py i zastąp zawartość następującym kodem:
import azure.functions as func


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

Utwórz funkcję emisji.

  1. Uruchom następujące polecenie, aby utworzyć broadcast funkcję.
func new -n broadcast -t TimerTrigger
# install requests
pip install requests
  1. Edytuj emisję/function.json i zastąp zawartość następującym kodem:
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "myTimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "*/5 * * * * *"
    },
    {
      "type": "signalR",
      "name": "signalRMessages",
      "hubName": "serverless",
      "connectionStringSetting": "AzureSignalRConnectionString",
      "direction": "out"
    }
  ]
}
  1. Edytuj emisję/_init_.py i zastąp zawartość następującym kodem:
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) ]
    }))

Tworzenie pliku index.html

Interfejs klienta dla tej aplikacji jest stroną internetową. Funkcja index odczytuje zawartość HTML z pliku content/index.html .

  1. Utwórz folder o nazwie content w folderze głównym projektu.
  2. Utwórz content/index.html pliku.
  3. Skopiuj następującą zawartość do pliku content/index.html i zapisz ją:
<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>

Dodawanie parametry połączenia usługi SignalR Service do ustawień aplikacji funkcji

Ostatnim krokiem jest ustawienie parametry połączenia usługi SignalR Service w ustawieniach aplikacji funkcji platformy Azure.

  1. W witrynie Azure Portal przejdź do wdrożonego wcześniej wystąpienia usługi SignalR.

  2. Wybierz pozycję Klucze, aby wyświetlić parametry połączenia dla wystąpienia usługi SignalR Service.

    Zrzut ekranu przedstawiający stronę Klucze usługi Azure SignalR.

  3. Skopiuj parametry połączenia podstawową i wykonaj polecenie:

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

Uruchamianie aplikacji funkcji platformy Azure lokalnie

Uruchom emulator magazynu Azurite:

azurite 

Uruchom aplikację funkcji platformy Azure w środowisku lokalnym:

func start

Uwaga

Jeśli w magazynie obiektów blob są wyświetlane błędy odczytu, upewnij się, że ustawienie "AzureWebJobsStorage" w pliku local.settings.json ma wartość UseDevelopmentStorage=true.

Po uruchomieniu funkcji platformy Azure lokalnie przejdź do strony http://localhost:7071/api/index. Na stronie zostanie wyświetlona bieżąca liczba gwiazdek dla repozytorium GitHub Azure/azure-signalr. Gdy w usłudze GitHub pojawi się gwiazdka lub co kilka sekund, odświeżona liczba zostanie wyświetlona.

Czyszczenie zasobów

Jeśli nie zamierzasz w przyszłości korzystać z tej aplikacji i nie chcesz, aby zostały naliczone jakiekolwiek opłaty, wykonaj następujące czynności w celu usunięcia wszystkich zasobów w ramach tego przewodnika Szybki start:

  1. W witrynie Azure Portal wybierz grupy zasobów daleko po lewej stronie, a następnie wybierz utworzoną grupę zasobów. Możesz też użyć pola wyszukiwania, aby odnaleźć grupę zasobów po nazwie.

  2. W otworzonym oknie wybierz grupę zasobów, a następnie kliknij pozycję Usuń grupę zasobów.

  3. W nowym oknie wpisz nazwę grupy zasobów, która ma zostać usunięta, a następnie kliknij pozycję Usuń.

Masz problemy? Wypróbuj przewodnik rozwiązywania problemów lub daj nam znać.

Następne kroki

W tym przewodniku Szybki start utworzono i uruchomiono aplikację bezserwerową w czasie rzeczywistym w środowisku lokalnym. Następnie dowiedz się więcej na temat korzystania z dwukierunkowej komunikacji między klientami i funkcją platformy Azure za pomocą usługi SignalR Service.