Orchestrace aplikací Python v .NET Aspire
V tomto článku se dozvíte, jak používat Python aplikace v hostiteli .NET Aspire aplikací. Příklad aplikace v tomto článku demonstruje spuštění Python aplikace. Rozšíření Python pro .NET Aspire vyžaduje použití virtuálních prostředí.
Požadavky
Pokud chcete pracovat s .NET.NET Aspire, potřebujete místně nainstalovat následující:
- .NET 8.0 nebo .NET 9.0
- Modul runtime kontejneru kompatibilní s OCI, například:
- Docker Desktop nebo Podman. Další informace najdete v tématu modulu runtime kontejneru.
- Integrované vývojové prostředí (IDE) nebo editor kódu, například:
- Visual Studio 2022 verze 17.9 nebo novější (volitelné)
-
Visual Studio Code (volitelné)
- C# Dev Kit: Rozšíření (volitelné)
- JetBrains Rider s .NET.NET Aspire plug-inem volitelně
Další informace najdete v tématu .NET.NET Aspire nastavení a nástrojea .NET.NET Aspire SDK.
Kromě toho je potřeba na počítač nainstalovat Python. Ukázková aplikace v tomto článku byla vytvořena s Python verze 3.12.4 a pip verze 24.1.2. Pokud chcete ověřit verze Python a pip, spusťte následující příkazy:
python --version
pip --version
Pokud chcete stáhnout Python (včetně pip
), podívejte se na stránku ke stažení Python.
Vytvoření .NET.NET Aspire projektu pomocí šablony
Pokud chcete začít s spuštěním projektu Python v .NET Aspire nejprve pomocí úvodní šablony vytvořte hostitele aplikace .NET Aspire:
dotnet new aspire -o PythonSample
Ve stejné relaci terminálu změňte adresáře na nově vytvořený projekt:
cd PythonSample
Po vytvoření šablony spusťte hostitele aplikace pomocí následujícího příkazu, který zajistí úspěšné spuštění hostitele aplikace a řídicího panelu .NET.NET Aspire:
dotnet run --project PythonSample.AppHost/PythonSample.AppHost.csproj
Jakmile se hostitel aplikace spustí, měl by být možné kliknout na odkaz řídicího panelu ve výstupu konzoly. V tomto okamžiku řídicí panel nezobrazí žádné prostředky. Zastavte hostitele aplikace stisknutím klávesy Ctrl + C v terminálu.
Příprava aplikace Python
Z předchozí relace terminálu, ve které jste vytvořili řešení .NET Aspire, vytvořte nový adresář, který bude obsahovat Python zdrojový kód.
mkdir hello-python
Přejděte do nově vytvořeného adresáře hello-python:
cd hello-python
Inicializace virtuálního prostředí Python
Aby bylo možné pracovat s Python aplikacemi, musí být ve virtuálním prostředí. Pokud chcete vytvořit virtuální prostředí, spusťte následující příkaz:
python -m venv .venv
Další informace o virtuálních prostředích najdete v Python: Instalace balíčků ve virtuálním prostředí pomocí pip a venv.
Pokud chcete aktivovat virtuální prostředí, povolte instalaci a používání balíčků, spusťte následující příkaz:
source .venv/bin/activate
Spuštěním následujícího příkazu se ujistěte, že pip v rámci virtuálního prostředí up-to-date:
python -m pip install --upgrade pip
Instalace balíčků Python
Nainstalujte balíček Flask vytvořením souboru requirements.txt v adresáři hello-python a přidáním následujícího řádku:
Flask==3.0.3
Potom nainstalujte balíček Flask spuštěním následujícího příkazu:
python -m pip install -r requirements.txt
Po instalaci Flasku vytvořte nový soubor s názvem main.py v adresáři hello-python a přidejte následující kód:
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)
Předchozí kód vytvoří jednoduchou aplikaci Flask, která naslouchá na portu 8111 a vrátí zprávu "Hello, World!"
při přístupu ke kořenovému koncovému bodu.
Aktualizace hostitelského projektu aplikace
Nainstalujte balíček hostování Python spuštěním následujícího příkazu:
dotnet add ../PythonSample.AppHost/PythonSample.AppHost.csproj package Aspire.Hosting.Python --version 9.0.0
Po instalaci balíčku by xml projektu měl mít nový odkaz na balíček podobný následujícímu:
<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>
Aktualizujte soubor hostitele aplikace Program.cs tak, aby zahrnoval projekt Python, zavoláním rozhraní API AddPythonApp
a zadáním názvu projektu, cesty k projektu a souboru vstupního bodu:
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();
Důležitý
Rozhraní API AddPythonApp
je experimentální a v budoucích verzích se může změnit. Další informace naleznete v tématu ASPIREHOSTINGPYTHON001.
Spuštění aplikace
Teď, když jste přidali balíček hostování Python, aktualizovali hostitele aplikace Program.cs soubor a vytvořili Python projekt, můžete spustit hostitele aplikace:
dotnet run --project ../PythonSample.AppHost/PythonSample.AppHost.csproj
Spusťte řídicí panel kliknutím na odkaz ve výstupu konzoly. Řídicí panel by měl zobrazit projekt Python jako zdroj.
Výběrem odkazu Koncové body otevřete koncový bod hello-python
na nové kartě prohlížeče. Prohlížeč by měl zobrazit zprávu "Hello, World!":
Zastavte hostitele aplikace stisknutím klávesy Ctrl + C v terminálu.
Přidání podpory telemetrie
Pokud chcete přidat trochu sledovatelnosti, přidejte telemetrii, která pomáhá sledovat závislou Python aplikaci. V projektu Python přidejte do souboru OpenTelemetry následující balíček jako závislost:
Flask==3.0.3
opentelemetry-distro
opentelemetry-exporter-otlp-proto-grpc
opentelemetry-instrumentation-flask
gunicorn
Předchozí aktualizace požadavku přidá balíček OpenTelemetry a vývozce OTLP. Potom znovu nainstalujte požadavky aplikace Python do virtuálního prostředí spuštěním následujícího příkazu:
python -m pip install -r requirements.txt
Předchozí příkaz nainstaluje balíček OpenTelemetry a vývozce OTLP ve virtuálním prostředí. Aktualizujte Python aplikaci tak, aby zahrnovala kód OpenTelemetry, a nahraďte stávající kód main.py následujícím kódem:
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)
Aktualizujte projekt hostování aplikace launchSettingsjson soubor tak, aby obsahoval proměnnou prostředí 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"
}
}
}
}
Proměnná ASPIRE_ALLOW_UNSECURED_TRANSPORT
je povinná, protože při místním spuštění OpenTelemetryclient v Python odmítne místní vývojový certifikát. Znovu spusťte hostitele aplikace :
dotnet run --project ../PythonSample.AppHost/PythonSample.AppHost.csproj
Po spuštění hostitele aplikace přejděte na řídicí panel a všimněte si, že kromě výstupu protokolu konzoly se strukturované protokolování směruje také na řídicí panel.
Shrnutí
I když existuje několik aspektů nad rámec tohoto článku, naučili jste se vytvářet .NET Aspire řešení, které se integruje s Python. Dozvěděli jste se také, jak používat rozhraní API AddPythonApp
k hostování Python aplikací.