Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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:
- .NET 8.0 o .NET 9.0
- Un entorno de ejecución de contenedor compatible con OCI, como:
- Docker Escritorio o Podman. Para obtener más información, consulte container runtime.
- Un entorno para desarrolladores integrado (IDE) o un editor de código, como:
- Visual Studio 2022 versión 17.9 o posterior (opcional)
-
Visual Studio Code (opcional)
- C# Dev Kit: extensión (opcional)
- JetBrains Rider con .NET.NET Aspire plugin (opcional)
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
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.
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!":
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.
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.