Apps Python in .NET Aspire organiseren
In dit artikel leert u hoe u Python apps kunt gebruiken in een .NET Aspire app-host. De voorbeeld-app in dit artikel laat zien hoe u een Python toepassing start. De Python-extensie voor .NET Aspire vereist het gebruik van virtuele omgevingen.
Voorwaarden
Als u met .NET.NET Aspirewilt werken, hebt u het volgende lokaal geïnstalleerd:
- .NET 8,0 of .NET 9,0
- Een OCI-compatibele containerruntime, zoals:
- Docker bureaublad of Podman. Zie container runtimevoor meer informatie.
- Een IDE (Integrated Developer Environment) of code-editor, zoals:
- Visual Studio 2022 versie 17.9 of hoger (optioneel)
-
Visual Studio Code (optioneel)
- C# Dev Kit: extensie- (optioneel)
- JetBrains Rider met .NET.NET Aspire plug-in (Optioneel)
Zie .NET.NET Aspire setup en hulpprogramma'sen .NET.NET Aspire SDK-voor meer informatie.
Daarnaast moet u Python installeren op uw computer. De voorbeeld-app in dit artikel is gebouwd met Python versie 3.12.4 en pip-versie 24.1.2. Voer de volgende opdrachten uit om uw Python- en pip-versies te controleren:
python --version
pip --version
Als u Python (inclusief pip
) wilt downloaden, raadpleegt u de Python downloadpagina.
Een .NET.NET Aspire-project maken met behulp van de sjabloon
Als u een Python-project wilt starten in .NET Aspire gebruikt u eerst de starterssjabloon om een .NET Aspire toepassingshost te maken:
dotnet new aspire -o PythonSample
Wijzig in dezelfde terminalsessie mappen in het zojuist gemaakte project:
cd PythonSample
Zodra de sjabloon is gemaakt, start u de app-host met de volgende opdracht om ervoor te zorgen dat de app-host en het .NET.NET Aspire dashboard worden gestart:
dotnet run --project PythonSample.AppHost/PythonSample.AppHost.csproj
Zodra de app-host is gestart, moet het mogelijk zijn om op de dashboardkoppeling in de console-uitvoer te klikken. Op dit moment worden er geen resources weergegeven op het dashboard. Stop de app-host door op Ctrl + C- in de terminal te drukken.
Een Python-app voorbereiden
Maak vanuit de vorige terminalsessie waarin u de .NET Aspire-oplossing hebt gemaakt een nieuwe map die de Python broncode bevat.
mkdir hello-python
Wijzig mappen in de zojuist gemaakte hello-python directory:
cd hello-python
De virtuele Python-omgeving initialiseren
Als u met Python apps wilt werken, moeten ze zich in een virtuele omgeving bevinden. Voer de volgende opdracht uit om een virtuele omgeving te maken:
python -m venv .venv
Zie de Python: Pakketten installeren in een virtuele omgeving met pip en venvvoor meer informatie over virtuele omgevingen.
Voer de volgende opdracht uit om de virtuele omgeving te activeren door installatie en gebruik van pakketten in te schakelen:
source .venv/bin/activate
Zorg ervoor dat pip binnen de virtuele omgeving up-to-date is door de volgende opdracht uit te voeren:
python -m pip install --upgrade pip
Python-pakketten installeren
Installeer het Flask-pakket door een requirements.txt-bestand te maken in de map hello-python- en de volgende regel toe te voegen:
Flask==3.0.3
Installeer vervolgens het Flask-pakket door de volgende opdracht uit te voeren:
python -m pip install -r requirements.txt
Nadat Flask is geïnstalleerd, maakt u een nieuw bestand met de naam main.py in de map hello-python en voegt u de volgende code toe:
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)
De voorgaande code maakt een eenvoudige Flask-app die luistert op poort 8111 en retourneert het bericht "Hello, World!"
wanneer het hoofdeindpunt wordt geopend.
Het app-hostproject bijwerken
Installeer het Python hostingpakket door de volgende opdracht uit te voeren:
dotnet add ../PythonSample.AppHost/PythonSample.AppHost.csproj package Aspire.Hosting.Python --version 9.0.0
Nadat het pakket is geïnstalleerd, moet de project-XML een nieuwe pakketreferentie hebben die er ongeveer als volgt uitziet:
<Project Sdk="Microsoft.NET.Sdk">
<Sdk Name="Aspire.AppHost.Sdk" Version="9.1.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.1.0" />
<PackageReference Include="Aspire.Hosting.Python" Version="9.1.0" />
</ItemGroup>
</Project>
Werk het Program.cs-bestand van de app-host bij om het Python project op te nemen door de AddPythonApp
-API aan te roepen en de projectnaam, het projectpad en het toegangspuntbestand op te geven:
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();
Belangrijk
De AddPythonApp
-API is experimenteel en kan in toekomstige releases veranderen. Zie ASPIREHOSTINGPYTHON001voor meer informatie.
De app uitvoeren
Nu u het Python hostingpakket hebt toegevoegd, de app-host Program.cs-bestand hebt bijgewerkt en een Python-project hebt gemaakt, kunt u de app-host uitvoeren:
dotnet run --project ../PythonSample.AppHost/PythonSample.AppHost.csproj
Start het dashboard door op de koppeling in de console-uitvoer te klikken. Het dashboard moet het Python project weergeven als een resource.
Selecteer de Eindpunten koppeling om het hello-python
-eindpunt te openen op een nieuw browsertabblad. In de browser moet het bericht 'Hallo, wereld!' worden weergegeven:
Stop de app-host door op Ctrl + C- in de terminal te drukken.
Telemetrieondersteuning toevoegen.
Als u een beetje waarneembaarheid wilt toevoegen, voegt u telemetrie toe om de afhankelijke Python app te bewaken. Voeg in het Python-project het volgende OpenTelemetry pakket toe als een afhankelijkheid in het requirements.txt-bestand:
Flask==3.0.3
opentelemetry-distro
opentelemetry-exporter-otlp-proto-grpc
opentelemetry-instrumentation-flask
gunicorn
Met de voorgaande vereiste update worden het OpenTelemetry-pakket en de OTLP-exporteur toegevoegd. Installeer vervolgens de Python app-vereisten opnieuw in de virtuele omgeving door de volgende opdracht uit te voeren:
python -m pip install -r requirements.txt
Met de voorgaande opdracht installeert u het OpenTelemetry-pakket en de OTLP-exporteur in de virtuele omgeving. Werk de Python-app bij om de OpenTelemetry code op te nemen door de bestaande main.py code te vervangen door het volgende:
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)
Werk het launchSettings.json-bestand van het app-hostproject bij om de ASPIRE_ALLOW_UNSECURED_TRANSPORT
omgevingsvariabele op te nemen:
{
"$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"
}
}
}
}
De ASPIRE_ALLOW_UNSECURED_TRANSPORT
-variabele is vereist omdat wanneer de OpenTelemetry-client lokaal in Python wordt uitgevoerd, het het lokale ontwikkelingscertificaat afwijst. Start de app-host opnieuw:
dotnet run --project ../PythonSample.AppHost/PythonSample.AppHost.csproj
Zodra de app-host is gestart, gaat u naar het dashboard en ziet u dat naast de uitvoer van het consolelogboek ook gestructureerde logboekregistratie naar het dashboard wordt doorgestuurd.
Samenvatting
Hoewel er verschillende overwegingen zijn die buiten het bereik van dit artikel vallen, hebt u geleerd hoe u .NET Aspire oplossing bouwt die kan worden geïntegreerd met Python. U hebt ook geleerd hoe u de AddPythonApp
-API gebruikt om Python apps te hosten.