Guia de início rápido: criar um aplicativo sem servidor com o Azure Functions e o Serviço Azure SignalR em Python
Comece a usar o Serviço Azure SignalR usando o Azure Functions e o Python para criar um aplicativo sem servidor que transmite mensagens para clientes. Você executará a função no ambiente local, conectando-se a uma instância do Serviço SignalR do Azure na nuvem. Concluir este início rápido incorre em um pequeno custo de alguns centavos de dólar ou menos em sua Conta do Azure.
Nota
Você pode obter o código neste artigo do GitHub.
Importante
As cadeias de conexão brutas aparecem neste artigo apenas para fins de demonstração.
Uma cadeia de conexão inclui as informações de autorização necessárias para seu aplicativo acessar o serviço Azure Web PubSub. A chave de acesso dentro da cadeia de conexão é semelhante a uma senha de root para o seu serviço. Em ambientes de produção, proteja sempre as suas chaves de acesso. Use o Azure Key Vault para gerenciar e girar suas chaves com segurança e proteger sua cadeia de conexão usando a ID do Microsoft Entra e autorizar o acesso com a ID do Microsoft Entra.
Evite distribuir chaves de acesso para outros usuários, codificá-las ou salvá-las em qualquer lugar em texto simples acessível a outras pessoas. Rode as chaves se acreditar que podem ter sido comprometidas.
Pré-requisitos
Este início rápido pode ser executado no macOS, Windows ou Linux. Você precisará do seguinte:
Pré-requisito | Description |
---|---|
Uma subscrição do Azure | Se você não tiver uma assinatura do Azure, crie uma conta gratuita do Azure |
Um editor de código | Você precisará de um editor de código, como o Visual Studio Code. |
Azure Functions Core Tools | Requer a versão 2.7.1505 ou superior para executar aplicativos Python Azure Function localmente. |
Python 3.7+ | O Azure Functions requer Python 3.7+. Consulte Versões Python suportadas. |
Azurita | A vinculação do SignalR precisa do Armazenamento do Azure. Você pode usar um emulador de armazenamento local quando uma função está sendo executada localmente. |
CLI do Azure | Opcionalmente, você pode usar a CLI do Azure para criar uma instância do Serviço Azure SignalR. |
Criar uma instância do Azure SignalR Service
Nesta seção, você cria uma instância básica do Azure SignalR para usar em seu aplicativo. As etapas a seguir usam o portal do Azure para criar uma nova instância, mas você também pode usar a CLI do Azure. Para obter mais informações, consulte o comando az signalr create na Referência da CLI do Serviço Azure SignalR.
- Inicie sessão no portal do Azure.
- No canto superior esquerdo da página, selecione + Criar um recurso.
- Na página Criar um recurso, na caixa de texto Serviços de pesquisa e marketplace, digite signalr e selecione Serviço SignalR na lista.
- Na página Serviço SignalR, selecione Criar.
- Na guia Noções básicas, você insere as informações essenciais para sua nova instância do Serviço SignalR. Introduza os seguintes valores:
Campo | Valor sugerido | Description |
---|---|---|
Subscrição | Selecione a sua subscrição | Selecione a assinatura que você deseja usar para criar uma nova instância do Serviço SignalR. |
Grupo de recursos | Criar um grupo de recursos chamado SignalRTestResources | Selecione ou crie um grupo de recursos para o seu recurso SignalR. É útil criar um novo grupo de recursos para este tutorial em vez de usar um grupo de recursos existente. Para liberar recursos depois de concluir o tutorial, exclua o grupo de recursos. A exclusão de um grupo de recursos também exclui todos os recursos que pertencem ao grupo. Esta ação não pode ser anulada. Antes de excluir um grupo de recursos, verifique se ele não contém recursos que você deseja manter. Para obter mais informações, veja Utilizar grupos de recursos para gerir os recursos do Azure. |
Nome do recurso | testsignalr | Introduza um nome de recurso exclusivo para utilizar no recurso do SignalR. Se o testsignalr já estiver em sua região, adicione um dígito ou caractere até que o nome seja exclusivo. O nome deve ser uma cadeia de 1 a 63 caracteres e conter apenas números, letras e o caractere hífen ( - ). O nome não pode começar ou terminar com o caractere de hífen e os caracteres de hífen consecutivos não são válidos. |
Região | Escolha a sua região | Selecione a região apropriada para sua nova instância do Serviço SignalR. O Serviço Azure SignalR não está atualmente disponível em todas as regiões. Para obter mais informações, consulte Disponibilidade da região do Serviço Azure SignalR |
Escalão de preço | Selecione Alterar e, em seguida, escolha Gratuito (Somente desenvolvimento/teste). Escolha Selecionar para confirmar sua escolha de nível de preço. | O Serviço Azure SignalR tem três níveis de preço: Gratuito, Standard e Premium. Os tutoriais usam o nível Gratuito , salvo indicação em contrário nos pré-requisitos. Para obter mais informações sobre as diferenças de funcionalidade entre camadas e preços, consulte Preços do Serviço Azure SignalR |
Modo de serviço | Escolha o modo de serviço apropriado | Use Padrão quando hospedar a lógica do hub SignalR em seus aplicativos Web e usar o serviço SignalR como proxy. Use Serverless quando usar tecnologias Serverless , como o Azure Functions, para hospedar a lógica do hub SignalR. O modo clássico é apenas para compatibilidade com versões anteriores e não é recomendado o uso. Para obter mais informações, consulte Modo de serviço no Serviço Azure SignalR. |
Não é necessário alterar as configurações nas guias Rede e Tags para os tutoriais do SignalR.
- Selecione o botão Rever + criar na parte inferior do separador Noções básicas .
- No separador Rever + criar, reveja os valores e, em seguida, selecione Criar. Leva alguns momentos para que a implantação seja concluída.
- Quando a implantação estiver concluída, selecione o botão Ir para recurso.
- Na página de recursos do SignalR, selecione Teclas no menu à esquerda, em Configurações.
- Copie a cadeia de conexão para a chave primária. Você precisa dessa cadeia de conexão para configurar seu aplicativo posteriormente neste tutorial.
Criar o projeto Azure Function
Crie um projeto local do Azure Function.
- A partir de uma linha de comando, crie um diretório para seu projeto.
- Mude para o diretório do projeto.
- Use o comando Azure Functions
func init
para inicializar seu projeto de função.
# Initialize a function project
func init --worker-runtime python
Criar as funções
Depois de inicializar um projeto, você precisa criar funções. Este projeto requer três funções:
index
: Hospeda uma página da Web para um cliente.negotiate
: Permite que um cliente obtenha um token de acesso.broadcast
: Usa um gatilho de tempo para transmitir mensagens periodicamente para todos os clientes.
Quando você executa o func new
comando do diretório raiz do projeto, as Ferramentas Principais do Azure Functions acrescentam o código da função no function_app.py
arquivo. Você editará os parâmetros do conteúdo do anúncio conforme necessário, substituindo o código padrão pelo código do aplicativo.
Criar a função de índice
Você pode usar essa função de exemplo como um modelo para suas próprias funções.
Abra o ficheiro function_app.py
. Este ficheiro irá conter as suas funções. Primeiro, modifique o arquivo para incluir as instruções de importação necessárias e defina as variáveis globais que usaremos nas funções a seguir.
import azure.functions as func
import os
import requests
import json
app = func.FunctionApp()
etag = ''
start_count = 0
- Adicione a função
index
adicionando o seguinte código
@app.route(route="index", auth_level=func.AuthLevel.ANONYMOUS)
def index(req: func.HttpRequest) -> func.HttpResponse:
f = open(os.path.dirname(os.path.realpath(__file__)) + '/content/index.html')
return func.HttpResponse(f.read(), mimetype='text/html')
Esta função hospeda uma página da Web para um cliente.
Criar a função de negociação
Adicione a função negotiate
adicionando o código a seguir.
As cadeias de conexão brutas aparecem neste artigo apenas para fins de demonstração. Em ambientes de produção, proteja sempre as suas chaves de acesso. Use o Azure Key Vault para gerenciar e girar suas chaves com segurança e proteger sua cadeia de conexão usando a ID do Microsoft Entra e autorizar o acesso com a ID do Microsoft Entra.
@app.route(route="negotiate", auth_level=func.AuthLevel.ANONYMOUS, methods=["POST"])
@app.generic_input_binding(arg_name="connectionInfo", type="signalRConnectionInfo", hubName="serverless", connectionStringSetting="AzureSignalRConnectionString")
def negotiate(req: func.HttpRequest, connectionInfo) -> func.HttpResponse:
return func.HttpResponse(connectionInfo)
Esta função permite que um cliente obtenha um token de acesso.
Crie uma função de transmissão.
Adicione a função broadcast
adicionando o seguinte código
@app.timer_trigger(schedule="*/1 * * * *", arg_name="myTimer",
run_on_startup=False,
use_monitor=False)
@app.generic_output_binding(arg_name="signalRMessages", type="signalR", hubName="serverless", connectionStringSetting="AzureSignalRConnectionString")
def broadcast(myTimer: func.TimerRequest, signalRMessages: func.Out[str]) -> None:
global etag
global start_count
headers = {'User-Agent': 'serverless', 'If-None-Match': etag}
res = requests.get('https://api.github.com/repos/azure/azure-functions-python-worker', headers=headers)
if res.headers.get('ETag'):
etag = res.headers.get('ETag')
if res.status_code == 200:
jres = res.json()
start_count = jres['stargazers_count']
signalRMessages.set(json.dumps({
'target': 'newMessage',
'arguments': [ 'Current star count of https://api.github.com/repos/azure/azure-functions-python-worker is: ' + str(start_count) ]
}))
Esta função usa um gatilho de tempo para transmitir mensagens periodicamente para todos os clientes.
Criar o projeto Azure Function
Crie um projeto local do Azure Function.
- A partir de uma linha de comando, crie um diretório para seu projeto.
- Mude para o diretório do projeto.
- Use o comando Azure Functions
func init
para inicializar seu projeto de função.
# Initialize a function project
func init --worker-runtime python --model v1
Criar as funções
Depois de inicializar um projeto, você precisa criar funções. Este projeto requer três funções:
index
: Hospeda uma página da Web para um cliente.negotiate
: Permite que um cliente obtenha um token de acesso.broadcast
: Usa um gatilho de tempo para transmitir mensagens periodicamente para todos os clientes.
Quando você executa o func new
comando a partir do diretório raiz do projeto, as Ferramentas Principais do Azure Functions criam arquivos de origem de função padrão e os armazenam em uma pasta com o nome da função. Você editará os arquivos conforme necessário, substituindo o código padrão pelo código do aplicativo.
Criar a função de índice
Você pode usar essa função de exemplo como um modelo para suas próprias funções.
- Execute o seguinte comando para criar a
index
função.
func new -n index -t HttpTrigger
- Edite o índice/function.json e substitua o conteúdo pelo seguinte código json:
{
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
]
}
- Edite index/_init_.py e substitua o conteúdo pelo seguinte código:
import os
import azure.functions as func
def main(req: func.HttpRequest) -> func.HttpResponse:
f = open(os.path.dirname(os.path.realpath(__file__)) + '/../content/index.html')
return func.HttpResponse(f.read(), mimetype='text/html')
Criar a função de negociação
- Execute o seguinte comando para criar a
negotiate
função.
func new -n negotiate -t HttpTrigger
- Edite negociar/function.json e substitua o conteúdo pelo seguinte código json:
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"type": "signalRConnectionInfo",
"name": "connectionInfo",
"hubName": "serverless",
"connectionStringSetting": "AzureSignalRConnectionString",
"direction": "in"
}
]
}
- Edite negotiate/_init_.py e substitua o conteúdo pelo seguinte código:
import azure.functions as func
def main(req: func.HttpRequest, connectionInfo) -> func.HttpResponse:
return func.HttpResponse(connectionInfo)
Crie uma função de transmissão.
- Execute o seguinte comando para criar a
broadcast
função.
func new -n broadcast -t TimerTrigger
# install requests
pip install requests
- Edite a transmissão/function.json e substitua o conteúdo pelo seguinte código:
{
"scriptFile": "__init__.py",
"bindings": [
{
"name": "myTimer",
"type": "timerTrigger",
"direction": "in",
"schedule": "*/5 * * * * *"
},
{
"type": "signalR",
"name": "signalRMessages",
"hubName": "serverless",
"connectionStringSetting": "AzureSignalRConnectionString",
"direction": "out"
}
]
}
- Edite broadcast/_init_.py e substitua o conteúdo pelo seguinte código:
import requests
import json
import azure.functions as func
etag = ''
start_count = 0
def main(myTimer: func.TimerRequest, signalRMessages: func.Out[str]) -> None:
global etag
global start_count
headers = {'User-Agent': 'serverless', 'If-None-Match': etag}
res = requests.get('https://api.github.com/repos/azure/azure-signalr', headers=headers)
if res.headers.get('ETag'):
etag = res.headers.get('ETag')
if res.status_code == 200:
jres = res.json()
start_count = jres['stargazers_count']
signalRMessages.set(json.dumps({
'target': 'newMessage',
'arguments': [ 'Current star count of https://github.com/Azure/azure-signalr is: ' + str(start_count) ]
}))
Criar o arquivo index.html
A interface do cliente para este aplicativo é uma página da web. A index
função lê o conteúdo HTML do arquivo content/index.html .
- Crie uma pasta chamada
content
na pasta raiz do projeto. - Crie o arquivo content/index.html.
- Copie o seguinte conteúdo para o arquivo content/index.html e salve-o:
<html>
<body>
<h1>Azure SignalR Serverless Sample</h1>
<div id="messages"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/3.1.7/signalr.min.js"></script>
<script>
let messages = document.querySelector('#messages');
const apiBaseUrl = window.location.origin;
const connection = new signalR.HubConnectionBuilder()
.withUrl(apiBaseUrl + '/api')
.configureLogging(signalR.LogLevel.Information)
.build();
connection.on('newMessage', (message) => {
document.getElementById("messages").innerHTML = message;
});
connection.start()
.catch(console.error);
</script>
</body>
</html>
Adicione a cadeia de conexão do Serviço SignalR às configurações do aplicativo de função
A última etapa é definir a cadeia de conexão do Serviço SignalR nas configurações do aplicativo Azure Function.
No portal do Azure, vá para a instância do SignalR que você implantou anteriormente.
Selecione Chaves para ver as cadeias de ligação para a instância do Serviço SignalR.
Copie a cadeia de conexão primária e execute o comando:
func settings add AzureSignalRConnectionString "<signalr-connection-string>"
Executar o aplicativo Azure Function localmente
Inicie o emulador de armazenamento Azurite:
azurite
Execute o aplicativo Azure Function no ambiente local:
func start
Nota
Se você vir um erro mostrando erros de leitura no armazenamento de blob, verifique se a configuração 'AzureWebJobsStorage' no arquivo local.settings.json está definida como UseDevelopmentStorage=true
.
Depois que a Função do Azure estiver sendo executada localmente, vá para http://localhost:7071/api/index
. A página exibe a contagem de estrelas atual para o repositório GitHub Azure/azure-signalr. Quando você estrela ou desestrela o repositório no GitHub, você verá a contagem atualizada a cada poucos segundos.
Clean up resources (Limpar recursos)
Se não pretender continuar a utilizar esta aplicação, elimine todos os recursos criados com este início rápido com os seguintes passos, para não lhe serem cobrados custos:
No portal do Azure, selecione Grupos de recursos à esquerda e, em seguida, selecione o grupo de recursos que criou. Em alternativa, pode utilizar a caixa de pesquisa para pesquisar o grupo de recursos pelo seu nome.
Na janela que abre, selecione o grupo de recursos e clique em Eliminar grupo de recursos.
Na nova janela, escreva o nome do grupo de recursos a eliminar e, em seguida, clique em Eliminar.
Tem problemas? Experimente o guia de resolução de problemas ou informe-nos.
Próximos passos
Neste início rápido, você criou e executou um aplicativo sem servidor em tempo real no local. Em seguida, saiba mais sobre como usar a comunicação bidirecional entre clientes e o Azure Function com o Serviço SignalR.