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:
- .NET 8.0 ou .NET 9.0
- Um runtime de contêiner compatível com OCI, como:
- Docker Desktop ou Podman. Para obter mais informações, consulte tempo de execução do contêiner.
- Um IDE (Ambiente de Desenvolvedor Integrado) ou um editor de código, como:
- Visual Studio 2022 versão 17.9 ou superior (opcional)
-
Visual Studio Code (opcional)
- C# Dev Kit: Extensão (opcional)
- JetBrains Rider com .NET.NET Aspire plug-in (opcional)
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.
Selecione o link Endpoints para abrir o endpoint hello-python
em uma nova guia do navegador. O navegador deve exibir a mensagem "Olá, Mundo!".
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.
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.