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:
- .NET 8.0 lub .NET 9.0
- Środowisko uruchomieniowe kontenera zgodne ze standardem OCI, takie jak:
- Docker Desktop lub Podman. Aby uzyskać więcej informacji, zobacz Container Runtime.
- Zintegrowane środowisko deweloperskie (IDE) lub edytor kodu, takie jak:
- Visual Studio 2022 w wersji 17.9 lub nowszej (opcjonalnie)
-
Visual Studio Code (opcjonalnie)
- C# Dev Kit: Rozszerzenie (opcjonalnie)
- JetBrains Rider z opcjonalną wtyczką .NET.NET Aspire
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
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.
Wybierz link Endpoints, aby otworzyć punkt końcowy hello-python
w nowej karcie przeglądarki. W przeglądarce powinien pojawić się komunikat "Hello, World!":
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.
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.