Artigo
· Jun. 30 7min de leitura

Exemplo de aplicação Flask com SQLAlchemy-IRIS - Parte 2

Por que conectar Flask com InterSystems IRIS?

A primeira coisa que vem à mente quando pensamos sobre a combinação de Flask com IRIS é um portal para interagir com seus clientes e parceiros. Um bom exemplo seria um website para pacientes acessarem seus exames clínicos. É claro, nesse caso seria necessário uma boa camada de segurança, que nós não cobrimos no último artigo. No enteando, podemos adicioná-la sem esforços com o Werkzeug, por exemplo.

Websites que fazem uma ponte entre a relação entre seus produtos e clientes são, de fato, um exemplo excelente do que você pode conseguir com essa conexão de tecnologias, já que o Flask é flexível, você pode facilmente adicionar e mudar quaisquer recursos com ele ou até fazer mais se tiver experiência com CI/CD.

Vamos dar uma olhada em alguns truques que você pode fazer. Se você se lembrar d primeira aplicação mostrada logo no início, deve se lembrar que o Flask não necessita de uma estrutura complexa para funcionar, o que significa que você pode construí-lo do zero com apenas alguns minutos de programação. Isso significa que você pode rapidamente criar múltiplas interfaces amigáveis ao usuário e portais interativos para exibir e analisar dados. Por exemplo, você pode rastrear cada parte de uma produção separadamente. Além disso, você pode providenciar quaisquer dos recursos InterSystems IRIS que usa frequentemente numa plataforma no-code bonita.

Eu trabalhei para a Innovatium desde o ano passado (2022), e essa experiência me ajudou a encontrar muitas situações onde seria muito prático observar a memória usada em resultados de consultas, requisições e tabelas de tempo em tempo. Esse problema é fácil de contornar, fazendo um portal similar ao criado no meu artigo anterior sobre Django. Já que desenvolver com um Flask é muito mais rápido do que com Django, seria menos custoso para construir algumas plataformas diferentes para cada projeto e para cada tabela que queremos rastrear. Além disso, se tiver um tempo extra, pode automatizar sua plataforma para receber atualizações ao vivo com Flask-SocktetIO.

Com um template em mãos para iniciar seus projetos, o desenvolvimento pode acelerar ainda mais. É por isso que na próxima seção vou introduzir um template Flask-IRIS CRUD publicado no OpenExchange (o que construímos na parte 1 dessa série de artigos). O que eu quero dizer é que se você não tem tempo para investigar todos os detalhes percorridos no último artigo, você pode apenas fazer o download da aplicação e continuar trabalhando com o seu conhecimento atual sobre seu projeto sem preocupações.
 

A aplicação OpenExchange

Eu decidi escrever essa série de artigos inspirada pela ideia mencionada em Example of Flask application with SQLAlchemy IRIS. No entanto, já que talvez você já esteja familiarizado com frameworks web em Python e a lógica CRUD, vou introduzir você a uma aplicação para colocar as mãos na massa imediatamente. Dessa maneira, você não precisa perder tempo lendo antes de o seu projeto começar a tomar forma.

Siga os passos abaixo para fazer o download e começar a usar a aplicação, e veja como é fácil. Tem uma versão mais sucinta do tutorial de utilização que segue no arquivo README no repositório GitHub. Você também pode verificar todo link relacionado ao app em sua página Open Exchange.

 

Guia de instalação

Antes de desenvolver projetos com Python, é sempre uma boa prática configurar um ambiente virtual. Isso irá te ajudar a adicionar todos os requisitos, configurações e variáveis estritamente a esse projeto, sem afetar seu computador ou outros projetos.

No Windows/Linux/macOS, abra o terminal no diretório que quer começar seu projeto e crie um ambiente virtual lá com o comando a seguir:
python -m venv .venv-folder

O comando mencionado acima pode ser desmembrado da seguinte maneira: "python" vai definir um ambiente Python para os comandos que o seguem. A flag "-m" vai rodar um módulo (nesse caso, venv), e ".venv-folder" vai criar uma pasta chamada venv-folder no diretório atual (referenciado pelo ponto), onde o módulo venv irá rodar. Obs.: venv = virtual enviroment = ambiente virtual.

Seu próximo passo será ativar o ambiente criado antes de fazer o download dos requisitos e propriamente iniciar seu projeto.

Se você usa macOS ou Linux, digite "..venv/bin/activate". No Windows, o comando similar ".venv\Scripts\activate" deve rodar o arquivo apropriado para a tarefa.

Em seguida, você pode clonar o repositório com git clone.
git clone https://github.com/heloisatambara/flask-iris.git

Finalmente, instale os requisitos com o Python Install Package (PIP) e você estará pronto para começar a programar.
pip install -r requirements.txt

Como você pode comprovar no arquivo referenciado, o comando acima irá instalar pelo menos a versão 2.3.3 do Flask, pelo menos a versão 3.1.1 do Flask-SQLAlchemy e pelo menos a versão 0.10.5 do sqlalchemy-iris, desenvolvida pela ^CaretDev.

 

Guia de utilização

Primeiro você deve conectar a aplicação à base de dados desejada e o namespace. Como você já deve ter aprendido no artigo anterior, essa conexão é feita no arquivo flaskr-iris/database.py, com o formato "iris://usuário:senha@host:porta/NAMESPACE", conforme especificado na documentação SQLALchemy para a função create_engine(). Verifique o exemplo abaixo.
    engine = create_engine("iris://_SYSTEM:sys@localhost:1972/SAMPLE")
  Agora você pode rodar a aplicação web e ver como o exemplo que você desenvolveu funciona, depois de checar se a instância está rodando, com o comando a seguir.
...\flask-iris> flask --app flaskr-iris run --debug

Para adaptar a aplicação às susas necessidades, comece editando o arquivo flaskr-iris/models.py para refletir os dados que você vai trazer do IRIS para o Python. O exemplo em clone do GitHub já cobre um grande número de casos, como você pode verificar no artigo anterior na seção dedicada a modelos. Se precisar de algo a mais, pode revisar a documentação relacionada em Flask-SQLAlchemy ou SQLAlchemy, sobre definir modelos e tabelas declarativas, respectivamente.

Então, é sugerido que você continue desenvolvendo editando os arquivos em flaskr-iris/templates/, para adaptar a exibição aos seus dados. A documentação Jinja contém todas as opções para programar seus templates.

Em seguida, você pode usar os exemplos em auth.py e blog.py para criar suas views. Não esqueça de registrar toda nova Blueprint na fábrica create_app(), no arquivo __init__.py.

Finalmente, os arquivos dentro da pasta estática devem te dar um avanço para adicionar o estilo da sua marca na página web.
 

Seção Bônus - Erros que encontrei e como corrigí-los

  • Começando com o que pode parecer um erro de principiante, mas pode acontecer com qualquer um: se você esqueceu de inicializar a instância IRIS que está conectando, pode receber a mensagem a seguir:
sqlalchemy.exc.OperationalError: (intersystems_iris.dbapi._DBAPI.OperationalError) [WinError 10061] No connection could be made because the target machine actively refused it.

É claro, tudo o que você precisa fazer aqui é apertar "Start InterSystems IRIS" e rodar seu app Flask novamente.
 

  • O próximo erro pode parecer um pouco mais desafiador:
RuntimeError: Working outside of request context.

This typically means that you attempted to use functionality that
needed an active HTTP request. Consult the documentation on testing
for information about how to avoid this problem.
db.init_app(app)

Esse erro pode ocorrer por causa de algumas diferentes razões. Se você o encontrou testando, use o test_client para simular uma requisição completa. Caso contrário, você pode precisar mover seu código a uma view. Entretanto, eu encontrei esse erro numa situação atípica: eu não tinha iniciado a base de dados com o app Flask. Para consertar isso, quando você definir sua base de dados com db = SQLAlchemy() ou algo similar, você pode conectar ao app diretamente com o seguinte:

app = Flask(__name__)
db = SQLAlchemy(app)

Outra alternativa é, se você está trabalhando com uma fábrica de aplicação, como mostrado no artigo anterior, você pode conectar ao app posteriormente, chamando init_app():

db = SQLAlchemy()

def create_app():
	app = Flask(__name__)
	db.init_app(app)
  • Se você escolher a abordagem da parte 1 desse artigo, você irá notar que toda vez que roda sua aplicação, ela tentará criar todas as bases de dados dos modelos que você definir. Isso significa que você deve tratar esse tipo de erro com um bloco "try/except". Uma opção é ignorar o erro se uma tabela já existe, mas não esqueça de corrigir outros erros também. Contudo, se você escolher essa solução, você pode ter que deletar todas as tabelas manualmente toda vez que fizer mudanças nelas. Outra opção é usar o atributo "checkfirst" quando chamar a função create_all(). Isso deve ignorar as tabelas que já existem, então as mudanças não serão aplicadas. Se isso satisfaz as suas necessidades, aproveite. Ainda assim, para uma implementação de maior escala, você pode usar o SQLAlchemy para derrubar tabelas criadas anteriormente, antes de rodar o create_all(). Cuidado: as tabelas serão criadas automaticamente com o formato de nome DefaultSchema_snake_case_model_name. Para ilustrar, no exemplo que exploramos, as tabelas foram construídas no IRSI com os nomes SQLUser_user e SQLUser_post.
try:
    with app.app_context():
        db.create_all()
except DatabaseError as err:
    if 'already exists' in err._sql_message():
        print("Databases already exist.")
    else:
        print(err) 
  • Por último, mas não menos importante, quando você coloca modelos num arquivo difetente do que você usou para rodar a função create_all(), você pode ter a impressão de que não funciona. Isso acontece porque você deve importar todo modelo que quiser montar antes de criá-los.
from .models import User, Post
db.init_app(app)
try:
    with app.app_context():
        db.create_all()
Discussão (0)1
Entre ou crie uma conta para continuar