Delen via


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:

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.

.NET Aspire dashboard: Python voorbeeld-app.

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:

.NET Aspire dashboard: Python eindpunt van voorbeeld-app.

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.

.NET Aspire dashboard: gestructureerde logboekregistratie van Python proces.

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.

Zie ook