Capítulo 2: Aplicação OCI PIZZA
2.3 Desenvolvimento Web com Python/Flask
2.3.1 Antes do Desenvolvimento
Após a definição dos requisitos, chega o momento de escolher a linguagem de programação, o framework e, o mais importante, definir de forma macro a arquitetura que será adotada inicialmente pela aplicação web para resolver o problema proposto.
Neste estágio, em que o foco é iniciar o desenvolvimento, diversas dúvidas podem surgir, como:
- Qual é a melhor linguagem de programação?
- Qual é o melhor framework?
- Qual é a arquitetura ideal para esta aplicação?
Essas questões são comuns no contexto do desenvolvimento de software, e a melhor resposta para elas é:
- Escolha a linguagem de programação e o framework que você mais conhece.
- Defina sua arquitetura de modo que ela resolva o seu problema da forma mais simples possível.
Para o desenvolvimento da aplicação OCI PIZZA, optou-se pela linguagem de programação Python e pelo microframework Flask para a construção de aplicações web.
O Que É Framework?
Um framework é um conjunto de código e ferramentas desenvolvido para resolver problemas específicos, funcionando como uma "caixa de ferramentas" para os desenvolvedores. Ele oferece códigos pré-definidos que economizam tempo e esforço durante o desenvolvimento de aplicações, além de incluir validações testadas e medidas de segurança, como a sanitização de dados, que protegem contra ataques, como SQL Injection, por exemplo. Isso não apenas aumenta a segurança, mas também reduz o tempo de desenvolvimento, pois muitas funcionalidades já estão prontas para uso.
Geralmente, um framework é composto por várias bibliotecas e outros frameworks, como é o caso do Flask, que utiliza Jinja, Click, Werkzeug e ItsDangerous em seu funcionamento interno.
Por fim, um framework influencia diretamente a forma como a aplicação é escrita, estabelecendo um padrão de desenvolvimento. Por exemplo, em vez de escrever manualmente o código para abrir um socket de rede e interpretar comandos do protocolo HTTP, um desenvolvedor pode usar um framework que já realiza essas tarefas automaticamente.
Por exemplo, o código abaixo implementa o método GET do HTTP:
Ao utilizar um framework como o Flask, o código seria o seguinte:
Observe que, ao utilizar o framework, não foi necessário programar os detalhes relacionados ao socket de rede (import socket). O framework abstrai todas essas complexidades, disponibilizando um decorador @app.route('/') que é aplicado sobre funções Python, com o objetivo de retornar um conteúdo HTML neste caso.
Ambos os códigos produzem como resultado o HTML <p>Hello World!</p>:
NOTA
Utilizar um framework realmente facilita o desenvolvimento de aplicações. No entanto, isso não significa que você, como desenvolvedor, não deva se preocupar com os detalhes que o framework abstrai. É fundamental saber o que acontece "debaixo do capô", pois esse conhecimento pode ser importante para resolver problemas obscuros que não são bem documentados pelo framework, por exemplo.
Abaixo estão alguns outros exemplos de frameworks:
-
- Um framework web de alto nível para Python que promove o desenvolvimento rápido e limpo, seguindo o padrão MVC.
-
- Spring Boot é um framework Java construído sobre o Spring que simplifica o desenvolvimento de aplicações.
-
- Ruby on Rails é um framework de aplicação web do lado do servidor desenvolvido em Ruby.
-
- Express.js é um framework projetado para a construção de aplicações web e APIs desenvolvido em JavaScript.
-
- Um framework web de alto desempenho para a linguagem de programação Go, projetado para simplificar o desenvolvimento de aplicações e APIs.
2.3.2 Introdução ao Microframework Flask
Flask é um framework desenvolvido em Python por Armin Ronacher, projetado para simplificar o desenvolvimento de aplicações web. É considerado um "microframework" devido ao seu tamanho reduzido, pois sua instalação padrão inclui apenas alguns componentes essenciais para a criação de aplicações web.
Flask pode ser ampliado por meio de componentes adicionais ou extensões, que podem ser instalados separadamente. Essas extensões oferecem funcionalidades extras à sua aplicação, como suporte a bancos de dados, autenticação de usuários, gerenciamento de formulários, etc.
Por exemplo, a aplicação OCI PIZZA utiliza alguns componentes instalados à parte, como o Jinja, que permite a utilização de templates HTML.
NOTA
Este livro abordará apenas o básico sobre o framework Flask referente ao seu uso no desenvolvimento da aplicação OCI PIZZA. Para obter mais informações, consulte a documentação disponível em sua página oficial: https://flask.palletsprojects.com
Instalação do Flask
A forma mais comum de instalar o Flask é por meio de um ambiente virtual Python (venv). Um ambiente virtual é, basicamente, uma cópia isolada do interpretador Python que opera de maneira independente no sistema operacional. A principal vantagem de utilizar um ambiente virtual é a possibilidade de agrupar sua aplicação e suas dependências em um único local, sem interferir na instalação global do Python no sistema operacional.
Para criar e ativar um ambiente virtual, utilize os comandos a seguir:
Após criar o ambiente virtual, você pode utilizar o comando pip para instalar o Flask e outras bibliotecas, conforme demonstrado nos comandos a seguir:
NOTA
O comando pip é o gerenciador de pacotes do Python, utilizado para instalar e gerenciar bibliotecas e dependências. Para mais informações, consulte o link: https://pypi.org/project/pip/
Todas as bibliotecas ou pacotes instalados, juntamente com suas versões, podem ser visualizados utilizando o comando pip freeze:
NOTA
Observe que outras bibliotecas foram instaladas como parte da instalação do Flask e do Jinja. Isso ocorre porque esses pacotes dependem de outros pacotes para funcionar. O comando pip gerencia essas dependências automaticamente para você.
A finalidade do pip freeze não é apenas visualizar as bibliotecas e suas dependências instaladas no ambiente virtual, mas também servir como um guia para a instalação das dependências do projeto.
Para aplicações escritas em Python, cria-se o arquivo requirements.txt, que conterá todas as dependências do projeto. Utilize o comando abaixo para gerar o arquivo requirements.txt:
Esse arquivo é útil caso você precise instalar seu projeto e suas dependências em outra máquina ou até mesmo na nuvem, utilizando o seguinte comando:
NOTA
Ao versionar um projeto de software, nunca incluímos as bibliotecas instaladas. Em Python, a prática recomendada é manter as dependências do projeto listadas no arquivo requirements.txt, a partir do qual as dependências são instaladas.
Bibliotecas e Dependências da Aplicação OCI PIZZA
A seguir, estão algumas das bibliotecas externas ao Flask que a aplicação OCI PIZZA utiliza:
-
- Flask-Login é uma extensão do Flask que simplifica a autenticação de usuários e o gerenciamento de sessões.
-
- Flask-JWT-Extended é uma extensão do Flask que simplifica a autenticação baseada em JSON Web Tokens (JWT).
-
- Flask-Session é uma extensão do Flask que permite o gerenciamento de sessões do lado do servidor (server-side sessions), oferecendo suporte a diferentes backends de armazenamento, como o Redis.
-
- Gunicorn é um servidor HTTP Python WSGI que permite a execução de aplicações web de forma eficiente e escalável. Ele é usado em aplicações web desenvolvidas em Python/Flask pois dá suporte a gerenciar múltiplos processos para lidar com diversas requisições simultâneas.
-
- Borneo é uma biblioteca que permite a interação com o Oracle NoSQL Database através da linguagem Python.
-
- O OCI Python SDK é uma biblioteca que permite interagir com os serviços da Oracle Cloud Infrastructure (OCI) através da linguagem Python.
Hello World com Flask
Uma aplicação básica em Flask apresenta a seguinte estrutura:
Algumas observações importantes sobre este trecho de código são:
1. from flask import Flask é uma instrução em Python que importa a classe Flask do módulo flask.
2. A instrução app = Flask(__name__) cria uma instância da classe Flask e a atribui à variável app. A partir de agora, todas as funcionalidades do Flask estarão disponíveis através dessa variável.
3. A instrução @app.route('/') define uma rota web. Isso significa que, após a aplicação ser iniciada, toda requisição para a raiz (/) acionará a função def hello_world(), e o resultado da execução será retornado ao cliente através da instrução return.
NOTA
Consulte a página de Tutoriais do Flask, disponível em https://flask.palletsprojects.com/en/stable/tutorial, para obter mais exemplos de códigos em Flask.
Execução do Flask
Para aplicações Flask, é comum utilizar os nomes de arquivos app.py ou wsgi.py como os principais "pontos de entrada" da aplicação web.
Para o exemplo Hello World, será utilizado o arquivo wsgi.py:
NOTA
A aplicação OCI PIZZA também utiliza o arquivo wsgi.py como o arquivo principal da aplicação.
Por fim, para executar e disponibilizar a aplicação na rede, utilize o comando abaixo:
NOTA
Este comando inicia um servidor simples que deve ser utilizado apenas durante o desenvolvimento da aplicação (--debug). Para executar a aplicação em produção, é recomendável utilizar um servidor WSGI dedicado, como o gunicorn. Para mais informações, consulte a seção "Deploying to Production" no seguinte link: https://flask.palletsprojects.com/en/stable/deploying/.
A partir de outro terminal, é possível testar o Hello World utilizando o comando curl:
2.3.3 JavaScript Vanilla
2.3.4 Componentes Lógicos da Aplicação OCI PIZZA
Templates
Flask Blueprints
Organização do Código
Enpoint de Monitoração
- Importante em ambientes CLOUD.