Compartilhar via


Orquestrar os aplicativos Python no .NET Aspire

Neste artigo, você aprenderá a usar aplicativos Python em um host de aplicativos .NET Aspire. O aplicativo de exemplo neste artigo demonstra a inicialização de um aplicativo Python. A extensão Python para .NET Aspire requer o uso de ambientes virtuais.

Pré-requisitos

Para trabalhar com .NET.NET Aspire, você precisa do seguinte instalado localmente:

Para obter mais informações, consulte .NET.NET Aspirede instalação e ferramentas e .NET.NET Aspiredo SDK.

Além disso, você precisa instalar Python em seu computador. O aplicativo de exemplo neste artigo foi criado com Python versão 3.12.4 e pip versão 24.1.2. Para verificar as versões Python e pip, execute os seguintes comandos:

python --version
pip --version

Para baixar Python (incluindo pip), consulte a página de download Python.

Criar um projeto .NET.NET Aspire usando o modelo

Para começar a iniciar um projeto de Python no .NET Aspire primeiro use o modelo inicial para criar um host de aplicativo .NET Aspire:

dotnet new aspire -o PythonSample

Na mesma sessão de terminal, altere os diretórios para o projeto recém-criado:

cd PythonSample

Depois que o modelo tiver sido criado, inicie o host do aplicativo com o seguinte comando para garantir que o host do aplicativo e o painel .NET.NET Aspire sejam iniciados com êxito:

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

Depois que o host do aplicativo for iniciado, será possível clicar no link do painel na saída do console. Neste ponto, o painel não mostrará nenhum recurso. Interrompa o host do aplicativo pressionando Ctrl + C no terminal.

Prepare um aplicativo Python

Na sessão do terminal anterior em que você criou a solução .NET Aspire, crie um novo diretório para conter o código-fonte Python.

mkdir hello-python

Altere os diretórios para o diretório hello-python recém-criado:

cd hello-python

Inicializar o ambiente virtual Python

Para trabalhar com Python aplicativos, eles precisam estar dentro de um ambiente virtual. Para criar um ambiente virtual, execute o seguinte comando:

python -m venv .venv

Para obter mais informações sobre ambientes virtuais, consulte o Python: Instalar pacotes em um ambiente virtual usando pip e venv.

Para ativar o ambiente virtual, habilitando a instalação e o uso de pacotes, execute o seguinte comando:

source .venv/bin/activate

Verifique se o pip dentro do ambiente virtual está up-to-date executando o seguinte comando:

python -m pip install --upgrade pip

Instalar pacotes de Python

Instale o pacote flask criando um arquivo requirements.txt no diretório hello-python e adicionando a seguinte linha:

Flask==3.0.3

Em seguida, instale o pacote flask executando o seguinte comando:

python -m pip install -r requirements.txt

Depois que o Flask for instalado, crie um novo arquivo chamado main.py no diretório hello-python e adicione o seguinte código:

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)

O código anterior cria um app Flask simples que escuta na porta 8111 e retorna a mensagem "Hello, World!" quando o endpoint raiz é acessado.

Atualizar o projeto de host do aplicativo

Instale o pacote de hospedagem Python executando o seguinte comando:

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

Depois que o pacote for instalado, o XML do projeto deverá ter uma nova referência de pacote semelhante à seguinte:

<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>

Atualize o host do aplicativo Program.cs arquivo para incluir o projeto Python, chamando a API AddPythonApp e especificando o nome do projeto, o caminho do projeto e o arquivo de ponto 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

A API AddPythonApp é experimental e pode mudar em versões futuras. Para obter mais informações, consulte ASPIREHOSTINGPYTHON001.

Executar o aplicativo

Agora que você adicionou o pacote de hospedagem Python, atualizou o host do aplicativo Program.cs arquivo e criou um projeto Python, você pode executar o host do aplicativo:

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

Inicie o painel clicando no link na saída do console. O painel deve exibir o projeto Python como um recurso.

painel .NET Aspire: App de exemplo Python.

Selecione o link Endpoints para abrir o endpoint hello-python em uma nova guia do navegador. O navegador deve exibir a mensagem "Olá, Mundo!".

.NET Aspire painel: Python ponto de extremidade de aplicativo de exemplo.

Interrompa o host do aplicativo pressionando Ctrl + C no terminal.

Adicione suporte à telemetria.

Para adicionar um certo nível de observabilidade, adicione telemetria para ajudar a monitorar o aplicativo dependente de Python. No projeto Python, adicione o seguinte pacote de OpenTelemetry como uma dependência no arquivo requirements.txt:

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

A atualização de requisito anterior adiciona o pacote OpenTelemetry e o exportador OTLP. Em seguida, reinstale os requisitos do aplicativo Python no ambiente virtual executando o seguinte comando:

python -m pip install -r requirements.txt

O comando anterior instala o pacote OpenTelemetry e o exportador OTLP, no ambiente virtual. Atualize o aplicativo Python para incluir o código OpenTelemetry, substituindo o código main.py existente pelo seguinte:

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)

Atualize o projeto de host do aplicativo launchSettings.json arquivo para incluir a variável de ambiente ASPIRE_ALLOW_UNSECURED_TRANSPORT:

{
  "$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"
      }
    }
  }
}

A variável ASPIRE_ALLOW_UNSECURED_TRANSPORT é necessária porque, ao executar localmente o OpenTelemetryclient em Python rejeita o certificado de desenvolvimento local. Inicie, novamente, o host do aplicativo .

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

Depois que o host do aplicativo for iniciado, navegue até o painel e observe que, além da saída do log do console, o log estruturado também está sendo roteado até o painel.

.NET Aspire dashboard: registro estruturado de logs do processo Python.

Resumo

Embora haja várias considerações que estão além do escopo deste artigo, você aprendeu a criar a solução .NET Aspire que se integra ao Python. Você também aprendeu a usar a API de AddPythonApp para hospedar aplicativos Python.

Consulte também