Udostępnij za pośrednictwem


Zarządzanie aplikacjami Python w .NET Aspire

Z tego artykułu dowiesz się, jak używać aplikacji Python na hoście aplikacji .NET Aspire. Przykładowa aplikacja w tym artykule pokazuje uruchamianie aplikacji Python. Rozszerzenie Python dla .NET Aspire wymaga użycia środowisk wirtualnych.

Warunki wstępne

Aby pracować z .NET.NET Aspire, musisz mieć zainstalowane lokalnie następujące elementy:

Aby uzyskać więcej informacji, zobacz .NET.NET Aspire setup and toolingi .NET.NET Aspire SDK.

Ponadto należy zainstalować Python na maszynie. Przykładowa aplikacja w tym artykule została zbudowana przy użyciu wersji 3.12.4 dla Python oraz wersji 24.1.2 dla pip. Aby zweryfikować wersje Python i pip, uruchom następujące polecenia:

python --version
pip --version

Aby pobrać Python (w tym pip), zobacz stronę pobierania Python.

Tworzenie projektu .NET.NET Aspire przy użyciu szablonu

Aby rozpocząć uruchamianie projektu Python w .NET Aspire najpierw użyj szablonu startowego do utworzenia hosta aplikacji .NET Aspire:

dotnet new aspire -o PythonSample

W tej samej sesji terminalu zmień katalogi na nowo utworzony projekt:

cd PythonSample

Po utworzeniu szablonu uruchom hosta aplikacji za pomocą następującego polecenia, aby upewnić się, że host aplikacji i pulpit nawigacyjny .NET.NET Aspire zostanie pomyślnie uruchomiony:

dotnet run --project PythonSample.AppHost/PythonSample.AppHost.csproj

Po uruchomieniu hosta aplikacji powinno być możliwe kliknięcie linku do panelu sterowania w wynikach konsoli. W tym momencie pulpit nawigacyjny nie będzie wyświetlał żadnych zasobów. Zatrzymaj hosta aplikacji, naciskając Ctrl + C w terminalu.

Przygotowywanie aplikacji Python

Z poprzedniej sesji terminalu, w której utworzono rozwiązanie .NET Aspire, utwórz nowy katalog zawierający kod źródłowy Python.

mkdir hello-python

Zmień katalogi na nowo utworzony katalog hello-python:

cd hello-python

Inicjowanie środowiska wirtualnego Python

Aby pracować z aplikacjami Python, muszą znajdować się w środowisku wirtualnym. Aby utworzyć środowisko wirtualne, uruchom następujące polecenie:

python -m venv .venv

Aby uzyskać więcej informacji na temat środowisk wirtualnych, zobacz Python: Instaluj pakiety w środowisku wirtualnym za pomocą pip oraz venv.

Aby aktywować środowisko wirtualne, włączając instalację i użycie pakietów, uruchom następujące polecenie:

source .venv/bin/activate

Upewnij się, że pip w środowisku wirtualnym jest up-to-date, uruchamiając następujące polecenie:

python -m pip install --upgrade pip

Instalowanie pakietów Python

Zainstaluj pakiet platformy Flask, tworząc plik requirements.txt w katalogu hello-python i dodając następujący wiersz:

Flask==3.0.3

Następnie zainstaluj pakiet Platformy Flask, uruchamiając następujące polecenie:

python -m pip install -r requirements.txt

Po zainstalowaniu platformy Flask utwórz nowy plik o nazwie main.py w katalogu hello- i dodaj następujący kod:

import os
import flask

app = flask.Flask(__name__)

@app.route('/', methods=['GET'])
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 8111))
    app.run(host='0.0.0.0', port=port)

Powyższy kod tworzy prostą aplikację Flask, która nasłuchuje na porcie 8111 i zwraca komunikat "Hello, World!" po uzyskaniu dostępu do głównego punktu dostępowego.

Aktualizowanie projektu hosta aplikacji

Zainstaluj pakiet hostingowy Python, uruchamiając następujące polecenie:

dotnet add ../PythonSample.AppHost/PythonSample.AppHost.csproj package Aspire.Hosting.Python --version 9.0.0

Po zainstalowaniu pakietu plik XML projektu powinien mieć nowe odwołanie do pakietu podobne do następującego:

<Project Sdk="Microsoft.NET.Sdk">

  <Sdk Name="Aspire.AppHost.Sdk" Version="9.0.0" />

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <IsAspireHost>true</IsAspireHost>
    <UserSecretsId>5fd92a87-fff8-4a09-9f6e-2c0d656e25ba</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Aspire.Hosting.AppHost" Version="9.0.0" />
    <PackageReference Include="Aspire.Hosting.Python" Version="9.0.0" />
  </ItemGroup>

</Project>

Zaktualizuj plik Program.cs hosta aplikacji, aby uwzględnić projekt Python, wywołując interfejs API AddPythonApp i określając nazwę projektu, ścieżkę projektu i plik punktu wejścia:

using Microsoft.Extensions.Hosting;

var builder = DistributedApplication.CreateBuilder(args);

#pragma warning disable ASPIREHOSTINGPYTHON001
var pythonapp = builder.AddPythonApp("hello-python", "../hello-python", "main.py")
       .WithHttpEndpoint(env: "PORT")
       .WithExternalHttpEndpoints()
       .WithOtlpExporter();
#pragma warning restore ASPIREHOSTINGPYTHON001

if (builder.ExecutionContext.IsRunMode && builder.Environment.IsDevelopment())
{
    pythonapp.WithEnvironment("DEBUG", "True");
}

builder.Build().Run();

Ważny

Interfejs API AddPythonApp jest eksperymentalny i może ulec zmianie w przyszłych wersjach. Aby uzyskać więcej informacji, zobacz ASPIREHOSTINGPYTHON001.

Uruchamianie aplikacji

Po dodaniu pakietu hosta Python, zaktualizowaniu pliku hosta aplikacji Program.cs i utworzeniu projektu Python, możesz uruchomić aplikację:

dotnet run --project ../PythonSample.AppHost/PythonSample.AppHost.csproj

Uruchom pulpit nawigacyjny, klikając link w danych wyjściowych konsoli. Pulpit nawigacyjny powinien wyświetlać projekt Python jako zasób.

pulpit nawigacyjny .NET Aspire: przykładowa aplikacja Python.

Wybierz link Endpoints, aby otworzyć punkt końcowy hello-python w nowej karcie przeglądarki. W przeglądarce powinien pojawić się komunikat "Hello, World!":

.NET Aspire pulpit nawigacyjny: Python przykładowy punkt końcowy aplikacji.

Zatrzymaj hosta aplikacji, naciskając Ctrl + C w terminalu.

Dodaj obsługę telemetrii.

Aby dodać trochę obserwowalności, dodaj dane telemetryczne, aby pomóc monitorować zależną aplikację Python. W projekcie Python dodaj następujący pakiet OpenTelemetry jako zależność w pliku requirements.txt:

Flask==3.0.3
opentelemetry-distro
opentelemetry-exporter-otlp-proto-grpc
opentelemetry-instrumentation-flask
gunicorn

Poprzednia aktualizacja wymagań dodaje pakiet OpenTelemetry i eksportera OTLP. Następnie ponownie zainstaluj wymagania aplikacji Python w środowisku wirtualnym, uruchamiając następujące polecenie:

python -m pip install -r requirements.txt

Poprzednie polecenie instaluje pakiet OpenTelemetry i eksportera OTLP w środowisku wirtualnym. Zaktualizuj aplikację Python, aby zawierała kod OpenTelemetry, zastępując istniejący kod main.py następującym kodem:

import os
import logging
import flask
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.instrumentation.flask import FlaskInstrumentor

app = flask.Flask(__name__)

trace.set_tracer_provider(TracerProvider())
otlpExporter = OTLPSpanExporter()
processor = BatchSpanProcessor(otlpExporter)
trace.get_tracer_provider().add_span_processor(processor)

FlaskInstrumentor().instrument_app(app)

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@app.route('/', methods=['GET'])
def hello_world():
    logger.info("request received!")
    return 'Hello, World!'

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 8111))
    debug = bool(os.environ.get('DEBUG', False))
    host = os.environ.get('HOST', '127.0.0.1')
    app.run(port=port, debug=debug, host=host)

Zaktualizuj plik launchSettings w projekcie hosta aplikacji .json, w celu uwzględnienia zmiennej środowiskowej: ASPIRE_ALLOW_UNSECURED_TRANSPORT.

{
  "$schema": "https://json.schemastore.org/launchsettings.json",
  "profiles": {
    "https": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:17171;http://localhost:15209",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "DOTNET_ENVIRONMENT": "Development",
        "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21171",
        "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22122"
      }
    },
    "http": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "http://localhost:15209",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "DOTNET_ENVIRONMENT": "Development",
        "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19171",
        "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20208",
        "ASPIRE_ALLOW_UNSECURED_TRANSPORT": "true"
      }
    }
  }
}

Zmienna ASPIRE_ALLOW_UNSECURED_TRANSPORT jest wymagana, ponieważ podczas lokalnego uruchamiania OpenTelemetryclient w Python odrzuca lokalny certyfikat dewelopera. Uruchom ponownie hosta aplikacji :

dotnet run --project ../PythonSample.AppHost/PythonSample.AppHost.csproj

pl-PL: Po uruchomieniu hosta aplikacji przejdź do pulpitu nawigacyjnego i zwróć uwagę, że oprócz wyników logów konsoli, rejestrowanie strukturalne jest również przesyłane do pulpitu nawigacyjnego.

panel sterowania: .NET Aspire logowanie strukturalne z procesu Python.

Streszczenie

Chociaż istnieje kilka zagadnień, które wykraczają poza zakres tego artykułu, przedstawiono sposób tworzenia rozwiązania .NET Aspire integrujące się z Python. Przedstawiono również sposób hostowania aplikacji AddPythonApp przy użyciu interfejsu API Python.

Zobacz też