Samordna Python appar i .NET Aspire
I den här artikeln lär du dig hur du använder Python-appar i en .NET Aspire-appvärd. Exempelappen i den här artikeln visar hur du startar ett Python program. Tillägget Python för .NET Aspire kräver användning av virtuella miljöer.
Förutsättningar
Om du vill arbeta med .NET.NET Aspirebehöver du följande installerat lokalt:
- .NET 8,0 eller .NET 9,0
- En OCI-kompatibel containerskörningsmiljö, till exempel:
- Docker Desktop eller Podman. Mer information finns i Container Runtime.
- En IDE (Integrated Developer Environment) eller kodredigerare, till exempel:
- Visual Studio 2022 version 17.9 eller senare (valfritt)
-
Visual Studio Code (valfritt)
- C# Dev Kit: Tillägg (valfritt)
- JetBrains Rider med .NET.NET Aspire plugin (valfritt)
Mer information finns i .NET.NET Aspire installation och verktygoch .NET.NET Aspire SDK.
Dessutom måste du installera Python på datorn. Exempelappen i den här artikeln skapades med Python version 3.12.4 och pip version 24.1.2. Kontrollera dina Python- och pip-versioner genom att köra följande kommandon:
python --version
pip --version
För att ladda ned Python (inklusive pip
), se Python nedladdningssidan.
Skapa ett .NET.NET Aspire projekt med hjälp av mallen
För att starta ett Python-projekt i .NET Aspire, använd först startmallen för att skapa en .NET Aspire-programvärd.
dotnet new aspire -o PythonSample
I samma terminalsession ändrar du kataloger till det nyligen skapade projektet:
cd PythonSample
När mallen har skapats, starta appvärden med följande kommando för att säkerställa att både appvärden och instrumentpanelen .NET.NET Aspire startar framgångsrikt.
dotnet run --project PythonSample.AppHost/PythonSample.AppHost.csproj
När appvärden startar bör det vara möjligt att klicka på instrumentpanelens länk i konsolens utdata. I det här läget visar instrumentpanelen inga resurser. Stoppa appvärden genom att trycka på Ctrl + C i terminalen.
Förbereda en Python app
Från den föregående terminalsessionen där du skapade .NET Aspire-lösningen skapar du en ny katalog som innehåller Python källkod.
mkdir hello-python
Ändra kataloger till den nyligen skapade katalogen hello-python:
cd hello-python
Initiera den virtuella miljön Python
För att kunna arbeta med Python appar måste de finnas i en virtuell miljö. Kör följande kommando för att skapa en virtuell miljö:
python -m venv .venv
Mer information om virtuella miljöer finns i Python: Installera paket i en virtuell miljö med pip och venv.
Om du vill aktivera den virtuella miljön och aktivera installation och användning av paket kör du följande kommando:
source .venv/bin/activate
Kontrollera att pip i den virtuella miljön är up-to-date genom att köra följande kommando:
python -m pip install --upgrade pip
Installera Python paket
Installera Flask-paketet genom att skapa en requirements.txt fil i katalogen hello-python och lägga till följande rad:
Flask==3.0.3
Installera sedan Flask-paketet genom att köra följande kommando:
python -m pip install -r requirements.txt
När Flask har installerats skapar du en ny fil med namnet main.py i katalogen hello-python och lägger till följande 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)
Föregående kod skapar en enkel Flask-app som lyssnar på port 8111 och returnerar meddelandet "Hello, World!"
när rotslutpunkten används.
Uppdatera appvärdprojektet
Installera Python värdpaketet genom att köra följande kommando:
dotnet add ../PythonSample.AppHost/PythonSample.AppHost.csproj package Aspire.Hosting.Python --version 9.0.0
När paketet har installerats bör projekt-XML ha en ny paketreferens som liknar följande:
<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>
Uppdatera appvärdens Program.cs fil så att den innehåller Python projektet genom att anropa AddPythonApp
-API:et och ange projektnamnet, projektsökvägen och startpunktsfilen:
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();
Viktig
AddPythonApp
-API:et är experimentellt och kan ändras i framtida versioner. Mer information finns i ASPIREHOSTINGPYTHON001.
Kör appen
Nu när du har lagt till Python värdpaket, uppdaterat appvärden Program.cs fil och skapat ett Python projekt kan du köra appvärden:
dotnet run --project ../PythonSample.AppHost/PythonSample.AppHost.csproj
Starta instrumentpanelen genom att klicka på länken i konsolens utskrift. Instrumentpanelen bör visa Python projektet som en resurs.
Välj länken slutpunkter för att öppna hello-python
slutpunkten på en ny webbläsarflik. Webbläsaren bör visa meddelandet "Hello, World!":
Stoppa appvärden genom att trycka på Ctrl + C i terminalen.
Lägg till stöd för telemetri.
Om du vill lägga till lite observerbarhet lägger du till telemetri för att övervaka den beroende Python appen. I Python-projektet lägger du till följande OpenTelemetry paket som ett beroende i requirements.txt-filen:
Flask==3.0.3
opentelemetry-distro
opentelemetry-exporter-otlp-proto-grpc
opentelemetry-instrumentation-flask
gunicorn
Den föregående kravuppdateringen lägger till OpenTelemetry-paketet och OTLP-exportören. Installera sedan om kraven för Python app i den virtuella miljön genom att köra följande kommando:
python -m pip install -r requirements.txt
Föregående kommando installerar OpenTelemetry-paketet och OTLP-exportören i den virtuella miljön. Uppdatera Python-appen så att den innehåller OpenTelemetry-koden genom att ersätta den befintliga main.py koden med följande:
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)
Uppdatera appvärdprojektets launchSettings.json-fil så att den innehåller ASPIRE_ALLOW_UNSECURED_TRANSPORT
miljövariabeln:
{
"$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"
}
}
}
}
Variabeln ASPIRE_ALLOW_UNSECURED_TRANSPORT
krävs eftersom OpenTelemetry-klienten i Python avvisar det lokala utvecklingscertifikatet när den körs lokalt. Starta appvärd igen:
dotnet run --project ../PythonSample.AppHost/PythonSample.AppHost.csproj
När appvärden har startat navigerar du till instrumentpanelen och observera att förutom konsolloggutdata dirigeras även strukturerad loggning till instrumentpanelen.
Sammanfattning
Det finns flera överväganden som ligger utanför den här artikelns omfång, men du har lärt dig hur du skapar .NET Aspire lösning som integreras med Python. Du har också lärt dig hur du använder AddPythonApp
-API:et som värd för Python appar.
Se även
.NET Aspire