Skip to content

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:

import socket

def start_server():
    # Cria um socket TCP
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # Define o endereço e a porta do servidor
    server_socket.bind(('localhost', 5000))

    # Escuta por conexões
    server_socket.listen(1)
    print("Servidor rodando em http://localhost:5000")

    while True:
        # Aceita uma conexão
        client_socket, addr = server_socket.accept()
        print(f"Conexão recebida de {addr}")

        # Recebe a requisição do cliente
        request = client_socket.recv(1024).decode()
        print(f"Requisição recebida:\n{request}")

        # Monta a resposta HTTP
        response = "HTTP/1.1 200 OK\r\n"
        response += "Content-Type: text/plain\r\n"
        response += "Connection: close\r\n\r\n"
        response += "<p>Hello, World!</p>"

        # Envia a resposta ao cliente
        client_socket.sendall(response.encode())

        # Fecha a conexão com o cliente
        client_socket.close()

if __name__ == "__main__":
    start_server()

Ao utilizar um framework como o Flask, o código seria o seguinte:

1
2
3
4
5
6
7
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return '<p>Hello World!</p>'

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

$ curl http://localhost:5000
<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:

  • Django

    • Um framework web de alto nível para Python que promove o desenvolvimento rápido e limpo, seguindo o padrão MVC.
  • Spring Boot

    • Spring Boot é um framework Java construído sobre o Spring que simplifica o desenvolvimento de aplicações.
  • Ruby on Rails

    • Ruby on Rails é um framework de aplicação web do lado do servidor desenvolvido em Ruby.
  • Express.js

    • Express.js é um framework projetado para a construção de aplicações web e APIs desenvolvido em JavaScript.
  • Gin

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

1
2
3
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $

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:

(venv) $ pip install Flask
(venv) $ pip install Jinja2

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:

(venv) $ pip freeze
blinker==1.8.2
click==8.1.8
flask==3.0.3
importlib-metadata==8.5.0
itsdangerous==2.2.0
jinja2==3.1.6
MarkupSafe==2.1.5
werkzeug==3.0.6
zipp==3.20.2

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:

(venv) $ pip freeze > 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:

(venv) $ pip install -r requirements.txt

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:

Hello World com Flask

Uma aplicação básica em Flask apresenta a seguinte estrutura:

1
2
3
4
5
6
7
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return '<p>Hello World!</p>'

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:

1
2
3
4
5
6
7
8
(venv) $ cat wsgi.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return '<p>Hello World!</p>'

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:

1
2
3
4
5
6
7
8
9
(venv) $ flask --app wsgi run --debug --reload --host 0.0.0.0 --port 5000
 * Serving Flask app 'wsgi'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 140-307-595

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:

$ curl http://localhost:5000
<p>Hello World!</p>

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.