Compartir a través de


Orquestación de aplicaciones Python en .NET Aspire

En este artículo, aprendes a usar aplicaciones Python en un anfitrión de aplicaciones .NET Aspire. La aplicación de ejemplo que se presenta en este artículo demuestra cómo iniciar una aplicación de Python. La extensión Python para .NET Aspire requiere el uso de entornos virtuales.

Prerrequisitos

Para trabajar con .NET.NET Aspire, necesita lo siguiente instalado localmente:

Para obtener más información, consulte configuración y herramientas de .NET.NET Aspirey sdk de .NET.NET Aspire.

Además, debe instalar Python en su máquina. La aplicación de ejemplo de este artículo se creó con Python versión 3.12.4 y pip versión 24.1.2. Para comprobar las versiones de Python y pip, ejecute los siguientes comandos:

python --version
pip --version

Para descargar Python (incluido pip), consulte la página de descarga de Python.

Creación de un proyecto de .NET.NET Aspire mediante la plantilla

Para comenzar un Python proyecto en .NET Aspire, use la plantilla de inicio para crear primero un .NET Aspire servidor de aplicaciones.

dotnet new aspire -o PythonSample

En la misma sesión de terminal, cambie los directorios al proyecto recién creado:

cd PythonSample

Una vez creada la plantilla, inicie el host de la aplicación con el siguiente comando para asegurarse de que el host de la aplicación y el .NET.NET Aspire panel se ejecutan correctamente:

dotnet run --project ./PythonSample.AppHost/PythonSample.AppHost.csproj

Si el .NET.NET Aspire Panel de control no se abre, ábralo con el vínculo en la salida en la consola. En este momento el panel no mostrará ningún recurso. Detenga el host de la aplicación presionando Ctrl + C en el terminal.

Prepara una aplicación de Python

Desde la sesión de terminal anterior en la que creó la solución .NET Aspire, cree un nuevo directorio para que contenga el código fuente Python.

mkdir hello-python

Cambia al directorio recién creado hello-python

cd hello-python

Inicialización del entorno virtual de Python

Para trabajar con aplicaciones Python, deben estar dentro de un entorno virtual. Para crear un entorno virtual, ejecute el siguiente comando:

python -m venv .venv

Para obtener más información sobre los entornos virtuales, consulte la Python: Instalación de paquetes en un entorno virtual mediante pip y venv.

Para activar el entorno virtual, habilite la instalación y el uso de paquetes, ejecute el siguiente comando:

source .venv/bin/activate

Asegúrese de que pip dentro del entorno virtual esté up-to-date ejecutando el siguiente comando:

python -m pip install --upgrade pip

Instalación de paquetes de Python

Instale el paquete Flask mediante la creación de un archivo requirements.txt en el directorio hello-python y agregue la siguiente línea:

Flask==3.0.3

A continuación, ejecute el siguiente comando para instalar el paquete de Flask:

python -m pip install -r requirements.txt

Una vez instalado Flask, cree un nuevo archivo denominado main.py en el directorio hello-python de y agregue el código siguiente:

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)

El código anterior crea una aplicación de Flask sencilla que escucha en el puerto 8111 y devuelve el mensaje "Hello, World!" cuando se accede al punto de conexión raíz.

Actualización del proyecto host de la aplicación

Instale el paquete de hospedaje Python ejecutando el siguiente comando:

dotnet add ../PythonSample.AppHost/PythonSample.AppHost.csproj package Aspire.Hosting.Python --version 9.0.0

Una vez instalado el paquete, el xml del proyecto debe tener una nueva referencia de paquete similar al ejemplo siguiente:

<Project Sdk="Microsoft.NET.Sdk">

  <Sdk Name="Aspire.AppHost.Sdk" Version="9.2.0" />

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <UserSecretsId>5fd92a87-fff8-4a09-9f6e-2c0d656e25ba</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Aspire.Hosting.AppHost" Version="9.3.1" />
    <PackageReference Include="Aspire.Hosting.Python" Version="9.3.1" />
  </ItemGroup>

</Project>

Reemplace el código del host de la aplicación Program.cs por el siguiente fragmento. Este código agrega el proyecto Python a .NET Aspire llamando a la API AddPythonApp y especificando el nombre del proyecto, la ruta de acceso del proyecto y el archivo de punto de entrada:

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();

Importante

El código anterior suprime el error diagnóstico ASPIREHOSTINGPYTHON001. Este error se genera porque la AddPythonApp API es experimental y podría cambiar en la versión futura. Para obtener más información, consulte Error del compilador ASPIREHOSTINGPYTHON001.

Ejecución de la aplicación

Ahora que ha agregado el paquete de hospedaje de Python, actualizó el archivo Program.cs del host de la aplicación y creó un proyecto de Python, puede ejecutar el host de la aplicación:

dotnet run --project ../PythonSample.AppHost/PythonSample.AppHost.csproj

Inicie el panel haciendo clic en el vínculo en la salida de la consola. El panel debe mostrar el proyecto de Python como un recurso.

Panel de control de .NET Aspire: aplicación de ejemplo Python.

Seleccione el vínculo de puntos de conexión para abrir el punto de conexión de hello-python en una nueva pestaña del explorador. El explorador debe mostrar el mensaje "Hello, World!":

panel de .NET Aspire: Python punto de conexión de la aplicación de muestra.

Detenga el host de la aplicación presionando Ctrl + C en el terminal.

Adición de compatibilidad con telemetría

Para agregar un poco de observabilidad, agregue telemetría para ayudar a supervisar la aplicación dependiente Python. En el Python proyecto, agregue los siguientes OpenTelemetry paquetes como una dependencia en el archivo requirements.txt :

Flask==3.0.3
opentelemetry-distro
opentelemetry-exporter-otlp-proto-grpc
opentelemetry-instrumentation-flask
gunicorn

A continuación, vuelva a instalar los requisitos de la Python aplicación en el entorno virtual mediante la ejecución del siguiente comando:

python -m pip install -r requirements.txt

El comando anterior instala el OpenTelemetry paquete y el exportador de OTLP en el entorno virtual. Actualice la aplicación Python para incluir el código de OpenTelemetry, reemplazando el código de main.py existente por lo siguiente:

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)

Actualice el archivo launchSettings.json del proyecto de host de la aplicación para incluir la variable de entorno ASPIRE_ALLOW_UNSECURED_TRANSPORT en el perfil http.

{
  "$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",
        "ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21171",
        "ASPIRE_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",
        "ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19171",
        "ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20208",
        "ASPIRE_ALLOW_UNSECURED_TRANSPORT": "true"
      }
    }
  }
}

La variable ASPIRE_ALLOW_UNSECURED_TRANSPORT es necesaria porque cuando se ejecuta localmente el cliente de OpenTelemetry en Python rechaza el certificado de desarrollo local. Vuelva a iniciar el host de la aplicación :

dotnet run --project ../PythonSample.AppHost/PythonSample.AppHost.csproj --launch-profile http

Importante

El .NET.NET Aspire host de la aplicación debe ejecutarse mediante HTTP en lugar de HTTPS. La OpenTelemetry biblioteca requiere HTTP cuando se ejecuta en un entorno de desarrollo local.

Una vez que se esté ejecutando el host de la aplicación, vaya al panel y seleccione la pestaña Registro estructurado . Observe que ahora contiene eventos de registro.

panel de control de .NET Aspire: registro estructurado del proceso Python.

Resumen

Aunque hay varias consideraciones que están fuera del ámbito de este artículo, has aprendido a crear una solución .NET Aspire que se integra con Python. También aprendiste a usar la API de AddPythonApp para alojar aplicaciones Python.

Consulte también