O autor selecionou o Fundo de Código Aberto e Gratuito para receber uma doação como parte do programa Escreva para Doações.
Introdução
Nas aplicações web, geralmente é necessário um banco de dados, que é uma coleção organizada de dados. Você usa um banco de dados para armazenar e manter dados persistentes que podem ser recuperados e manipulados de forma eficiente. Por exemplo, em uma aplicação de mídia social, você tem um banco de dados onde os dados do usuário (informações pessoais, publicações, comentários, seguidores) são armazenados de uma forma que pode ser manipulada de forma eficiente. Você pode adicionar dados a um banco de dados, recuperá-los, modificá-los ou excluí-los, dependendo de diferentes requisitos e condições. Em uma aplicação web, esses requisitos podem ser um usuário adicionando uma nova publicação, excluindo uma publicação ou excluindo sua conta, o que pode ou não excluir suas publicações. As ações que você realiza para manipular dados dependerão de recursos específicos em sua aplicação. Por exemplo, você pode não querer que os usuários adicionem publicações sem títulos.
O Flask é um framework web leve em Python que fornece ferramentas úteis e recursos para criar aplicações web na linguagem Python. O PostgreSQL, ou Postgres, é um sistema de gerenciamento de banco de dados relacional que fornece uma implementação da linguagem de consulta SQL. É compatível com padrões e possui muitos recursos avançados, como transações confiáveis e concorrência sem bloqueios de leitura.
Neste tutorial, você irá construir uma pequena aplicação web de revisão de livros que demonstra como usar a biblioteca psycopg2
, um adaptador de banco de dados PostgreSQL que permite interagir com seu banco de dados PostgreSQL em Python. Você irá usá-lo com o Flask para realizar tarefas básicas, como conectar-se a um servidor de banco de dados, criar tabelas, inserir dados em uma tabela e recuperar dados de uma tabela.
Pré-requisitos
-
Um ambiente de programação Python 3 local. Siga o tutorial para sua distribuição na série Como Instalar e Configurar um Ambiente de Programação Local para Python 3. Neste tutorial, o diretório do projeto é chamado de
flask_app
. -
Um entendimento dos conceitos básicos do Flask, como rotas, funções de visualização e modelos. Se não estiver familiarizado com o Flask, confira Como Criar Sua Primeira Aplicação Web Usando Flask e Python e Como Usar Modelos em uma Aplicação Flask.
-
Um entendimento dos conceitos básicos de HTML. Você pode revisar nossa série de tutoriais Como Construir um Site com HTML para conhecimento básico.
-
O PostgreSQL instalado em sua máquina local e acesso ao prompt do PostgreSQL. Siga Como Instalar e Usar o PostgreSQL no Ubuntu 20.04 para configurar seu banco de dados PostgreSQL.
Passo 1 — Criando o Banco de Dados e Usuário do PostgreSQL
Neste passo, você criará um banco de dados chamado flask_db
e um usuário de banco de dados chamado sammy
para sua aplicação Flask.
Durante a instalação do Postgres, um usuário do sistema operacional chamado postgres
foi criado para corresponder ao usuário administrativo do PostgreSQL, postgres
. Você precisa usar este usuário para realizar tarefas administrativas. Você pode usar sudo
e passar o nome de usuário com a opção -iu
.
Acesse uma sessão interativa do Postgres usando o seguinte comando:
Você será direcionado para um prompt do PostgreSQL onde poderá configurar suas necessidades.
Primeiro, crie um banco de dados para seu projeto:
Nota: Cada declaração do Postgres deve terminar com um ponto e vírgula, então certifique-se de que seu comando termine com um se estiver enfrentando problemas.
Em seguida, crie um usuário de banco de dados para o nosso projeto. Certifique-se de selecionar uma senha segura:
Em seguida, dê a esse novo usuário acesso para administrar seu novo banco de dados:
Para confirmar que o banco de dados foi criado, obtenha a lista de bancos de dados digitando o seguinte comando:
Você verá flask_db
na lista de bancos de dados.
Quando terminar, saia do prompt do PostgreSQL digitando:
O Postgres agora está configurado para que você possa conectar-se e gerenciar suas informações de banco de dados via Python usando a biblioteca psycopg2
. Em seguida, você instalará esta biblioteca ao lado do pacote Flask.
Passo 2 — Instalando Flask e psycopg2
Neste passo, você instalará o Flask e a biblioteca psycopg2
para que possa interagir com seu banco de dados usando Python.
Com seu ambiente virtual ativado, use o pip
para instalar o Flask e a biblioteca psycopg2
:
Assim que a instalação for concluída com sucesso, você verá uma linha semelhante à seguinte no final da saída:
Output
Successfully installed Flask-2.0.2 Jinja2-3.0.3 MarkupSafe-2.0.1 Werkzeug-2.0.2 click-8.0.3 itsdangerous-2.0.1 psycopg2-binary-2.9.2
Agora você tem os pacotes necessários instalados no seu ambiente virtual. Em seguida, você conectará e configurará seu banco de dados.
Passo 3 — Configurando um Banco de Dados
Neste passo, você irá criar um arquivo Python no diretório do seu projeto flask_app
para se conectar ao banco de dados flask_db
, criar uma tabela para armazenar livros e inserir alguns livros com avaliações nele.
Primeiro, com o seu ambiente de programação ativado, abra um novo arquivo chamado init_db.py
no diretório do seu flask_app
.
Este arquivo abrirá uma conexão com o banco de dados flask_db
, criará uma tabela chamada books
e populará a tabela usando dados de exemplo. Adicione o seguinte código a ele:
Salve e feche o arquivo.
Neste arquivo, você primeiro importa o módulo os
que você usará para acessar variáveis de ambiente onde armazenará o nome de usuário e a senha do seu banco de dados para que não sejam visíveis no seu código fonte.
Você importa a biblioteca psycopg2
. Em seguida, você abre uma conexão com o banco de dados flask_db
usando a função psycopg2.connect()
. Você especifica o host, que é o localhost neste caso. Você passa o nome do banco de dados para o parâmetro database
.
Você fornece seu nome de usuário e senha através do objeto os.environ
, que lhe dá acesso às variáveis de ambiente que você configurou em seu ambiente de programação. Você armazenará o nome de usuário do banco de dados em uma variável de ambiente chamada DB_USERNAME
e a senha em uma variável de ambiente chamada DB_PASSWORD
. Isso permite que você armazene seu nome de usuário e senha fora do seu código-fonte, para que suas informações sensíveis não sejam expostas quando o código-fonte for salvo no controle de origem ou carregado para um servidor na internet. Mesmo que um invasor ganhe acesso ao seu código-fonte, eles não terão acesso ao banco de dados.
Você cria um cursor chamado cur
usando o método connection.cursor()
, que permite que o código Python execute comandos PostgreSQL em uma sessão de banco de dados.
Você utiliza o método execute()
do cursor para excluir a tabela books
caso ela já exista. Isso evita a possibilidade de outra tabela com o nome books
existir, o que pode resultar em comportamento confuso (por exemplo, se ela tiver colunas diferentes). Isso não é o caso aqui, porque você ainda não criou a tabela, então o comando SQL não será executado. Note que isso irá excluir todos os dados existentes sempre que você executar este arquivo init_db.py
. Para nossos propósitos, você executará este arquivo apenas uma vez para iniciar o banco de dados, mas você pode querer executá-lo novamente para excluir quaisquer dados que você inseriu e começar novamente com os dados de exemplo iniciais.
Em seguida, você utiliza CREATE TABLE books
para criar uma tabela chamada books
com as seguintes colunas:
id
: Um ID do tiposerial
, que é um número autoincrementável. Esta coluna representa uma chave primária que você especifica usando as palavras-chavePRIMARY KEY
. O banco de dados atribuirá um valor único a esta chave para cada entrada.title
: O título do livro do tipovarchar
, que é um tipo de caractere de comprimento variável com limite.varchar (150)
significa que o título pode ter até 150 caracteres de comprimento.NOT NULL
significa que esta coluna não pode estar vazia.author
: O autor do livro, com um limite de 50 caracteres.NOT NULL
significa que esta coluna não pode estar vazia.pages_num
: Um número inteiro representando o número de páginas que o livro possui.NOT NULL
significa que esta coluna não pode estar vazia.revisão
: A revisão do livro. O tipo detexto
significa que a revisão pode ser texto de qualquer comprimento.data_adicionada
: A data em que o livro foi adicionado à tabela.DEFAULT
define o valor padrão da coluna comoCURRENT_TIMESTAMP
, que é o momento em que o livro foi adicionado ao banco de dados. Assim comoid
, você não precisa especificar um valor para esta coluna, pois será preenchido automaticamente.
Após criar a tabela, você usa o método execute()
do cursor para inserir dois livros na tabela, A Tale of Two Cities de Charles Dickens, e Anna Karenina de Leo Tolstoy. Você usa o marcador %s
para passar os valores para a instrução SQL. O psycopg2
lida com a inserção em segundo plano de uma forma que evita ataques de injeção de SQL.
Depois de terminar de inserir os dados do livro na tabela, você usa o método connection.commit()
para confirmar a transação e aplicar as alterações ao banco de dados. Em seguida, você limpa as coisas fechando o cursor com cur.close()
e a conexão com conn.close()
.
Para que a conexão com o banco de dados seja estabelecida, defina as variáveis de ambiente DB_USERNAME
e DB_PASSWORD
executando os seguintes comandos. Lembre-se de usar seu próprio nome de usuário e senha:
Agora, execute seu arquivo init_db.py
no terminal usando o comando python
:
Uma vez que o arquivo terminar a execução sem erros, uma nova tabela books
será adicionada ao seu banco de dados flask_db
.
Acesse uma sessão interativa do Postgres para verificar a nova tabela books
.
Conecte-se ao banco de dados flask_db
usando o comando \c
:
Em seguida, use uma declaração SELECT
para obter os títulos e autores dos livros da tabela books
:
Você verá uma saída como a seguinte:
title | author
----------------------+------------------
A Tale of Two Cities | Charles Dickens
Anna Karenina | Leo Tolstoy
Saia da sessão interativa com \q
.
Em seguida, você criará um pequeno aplicativo Flask, conectará ao banco de dados, recuperará as duas resenhas de livros que inseriu no banco de dados e as exibirá na página de índice.
Passo 4 — Exibindo Livros
Neste passo, você criará um aplicativo Flask com uma página de índice que recupera os livros que estão no banco de dados e os exibe.
Com seu ambiente de programação ativado e o Flask instalado, abra um arquivo chamado app.py
para edição dentro do seu diretório flask_app
:
Este arquivo configurará sua conexão com o banco de dados e criará uma única rota Flask para usar essa conexão. Adicione o seguinte código ao arquivo:
Salve e feche o arquivo.
Aqui, você importa o módulo os
, a biblioteca psycopg2
, e a classe Flask
e a função render_template()
do pacote flask
. Você cria uma instância de aplicativo Flask chamada app
.
Você define uma função chamada get_db_connection()
, que abre uma conexão com o banco de dados flask_db
usando o usuário e a senha armazenados em suas variáveis de ambiente DB_USERNAME
e DB_PASSWORD
. A função retorna o objeto de conexão conn
que você usará para acessar o banco de dados.
Então você cria uma rota principal /
e uma função de visualização index()
usando o decorador app.route()
. Na função de visualização index()
, você abre uma conexão com o banco de dados usando a função get_db_connection()
, cria um cursor e executa a instrução SQL SELECT * FROM books;
para obter todos os livros que estão no banco de dados. Você usa o método fetchall()
para salvar os dados em uma variável chamada books
. Em seguida, você fecha o cursor e a conexão. Por fim, você retorna uma chamada para a função render_template()
para renderizar um arquivo de modelo chamado index.html
, passando-lhe a lista de livros que você obteve do banco de dados na variável books
.
Para exibir os livros que você tem em seu banco de dados na página de índice, primeiro você criará um modelo base, que terá todo o código HTML básico que outros modelos também usarão para evitar repetição de código. Em seguida, você criará o arquivo de modelo index.html
que renderizou em sua função index()
. Para aprender mais sobre modelos, consulte Como Usar Modelos em uma Aplicação Flask.
Crie um diretório templates
, depois abra um novo modelo chamado base.html
:
Adicione o seguinte código dentro do arquivo base.html
:
Salve e feche o arquivo.
Este modelo base tem todo o esqueleto HTML que você precisará reutilizar em seus outros modelos. O bloco title
será substituído para definir um título para cada página, e o bloco content
será substituído pelo conteúdo de cada página. A barra de navegação possui dois links, um para a página de índice onde você usa a função auxiliar url_for()
para vincular à função de visualização index()
, e o outro para uma página Sobre se você optar por incluir uma em sua aplicação.
Em seguida, abra um modelo chamado index.html
. Este é o modelo que você referenciou no arquivo app.py
:
Adicione o seguinte código a ele:
Salve e feche o arquivo.
Neste arquivo, você estende o modelo base e substitui o conteúdo do bloco content
. Você usa um título <h1>
que também serve como título.
Você utiliza um loop Jinja for
na linha {% for book in books %}
para percorrer cada livro na lista books
. Você exibe o ID do livro, que é o primeiro item usando book[0]
. Em seguida, exibe o título do livro, autor, número de páginas, resenha e a data em que o livro foi adicionado.
Enquanto estiver no diretório flask_app
com o seu ambiente virtual ativado, informe ao Flask sobre a aplicação (app.py
neste caso) usando a variável de ambiente FLASK_APP
. Em seguida, defina a variável de ambiente FLASK_ENV
para development
para executar a aplicação no modo de desenvolvimento e obter acesso ao depurador. Para obter mais informações sobre o depurador do Flask, consulte Como Lidar com Erros em uma Aplicação Flask. Utilize os seguintes comandos para fazer isso:
Certifique-se de definir as variáveis de ambiente DB_USERNAME
e DB_PASSWORD
se ainda não as tiver definido:
Em seguida, execute a aplicação:
Com o servidor de desenvolvimento em execução, visite a seguinte URL usando seu navegador:
http://127.0.0.1:5000/
Você verá os livros que adicionou ao banco de dados na primeira inicialização.
Você exibiu os livros em seu banco de dados na página de índice. Agora você precisa permitir que os usuários adicionem novos livros. Você irá adicionar uma nova rota para adicionar livros no próximo passo.
Passo 5 — Adicionando Novos Livros
Neste passo, você criará uma nova rota para adicionar novos livros e avaliações ao banco de dados.
Você adicionará uma página com um formulário da web onde os usuários inserem o título do livro, o autor do livro, o número de páginas e a resenha do livro.
Deixe o servidor de desenvolvimento em execução e abra uma nova janela de terminal.
Primeiro, abra seu arquivo app.py
:
Para lidar com o formulário da web, você precisará importar algumas coisas do pacote flask
:
- O objeto global
request
para acessar os dados enviados. - A função
url_for()
para gerar URLs. - A função
redirect()
para redirecionar os usuários para a página inicial após adicionar um livro ao banco de dados.
Adicione essas importações à primeira linha do arquivo:
Em seguida, adicione a seguinte rota ao final do arquivo app.py
:
Salve e feche o arquivo.
Nesta rota, você passa a tupla ('GET', 'POST')
para o parâmetro methods
para permitir tanto requisições GET quanto POST. Requisições GET são usadas para recuperar dados do servidor. Requisições POST são usadas para enviar dados para uma rota específica. Por padrão, apenas requisições GET são permitidas. Quando o usuário faz a primeira requisição para a rota /create
usando uma requisição GET, um arquivo de modelo chamado create.html
será renderizado. Você irá editar esta rota posteriormente para lidar com requisições POST quando os usuários preencherem e submeterem o formulário web para adicionar novos livros.
Abra o novo modelo create.html
:
Adicione o seguinte código a ele:
Salve e feche o arquivo.
Você estende o modelo base, define um cabeçalho como título e usa uma tag <form>
com o atributo method
definido como post
para indicar que o formulário enviará uma requisição POST.
Você tem um campo de texto com o nome title
, que será usado para acessar os dados do título em sua rota /create
.
Você tem um campo de texto para o autor, um campo de número para o número de páginas e uma área de texto para a resenha do livro.
Por último, você tem um botão Submit no final do formulário.
Agora, com o servidor de desenvolvimento em execução, use seu navegador para navegar até a rota /create
:
http://127.0.0.1:5000/create
Você verá uma página Adicionar um Novo Livro com um campo de entrada para o título do livro, um para o autor, outro para o número de páginas do livro, uma área de texto para a resenha do livro e um botão Submit.
Se você preencher o formulário e enviá-lo, enviando uma solicitação POST para o servidor, nada acontece porque você não lidou com solicitações POST na rota /create
.
Abra o arquivo app.py
para lidar com a solicitação POST que o usuário envia:
Edite a rota /create
para ficar como segue:
Salve e feche o arquivo.
Você lida com solicitações POST dentro da condição if request.method == 'POST'
. Você extrai o título, autor, número de páginas e a revisão que o usuário envia do objeto request.form
.
Você abre um banco de dados usando a função get_db_connection()
, e cria um cursor. Em seguida, você executa uma instrução SQL INSERT INTO
para inserir o título, autor, número de páginas e revisão que o usuário enviou na tabela books
.
Você confirma a transação e fecha o cursor e a conexão.
Por último, você redireciona o usuário para a página inicial onde eles podem ver o novo livro adicionado abaixo dos livros existentes.
Com o servidor de desenvolvimento em execução, use seu navegador para navegar até a rota /create
:
http://127.0.0.1:5000/create
Preencha o formulário com alguns dados e envie.
Você será redirecionado para a página inicial onde verá sua nova revisão de livro.
Em seguida, você adicionará um link para a página Criar na barra de navegação. Abra base.html
:
Edite o arquivo para ficar como segue:
Salve e feche o arquivo.
Aqui, você adiciona um novo link <a>
à barra de navegação que aponta para a página de Criação.
Atualize sua página de índice e você verá o novo link na barra de navegação.
Agora você tem uma página com um formulário da web para adicionar novas resenhas de livros. Para mais informações sobre formulários da web, consulte Como Usar Formulários da Web em uma Aplicação Flask. Para um método mais avançado e seguro de gerenciar formulários da web, consulte Como Usar e Validar Formulários da Web com Flask-WTF.
Conclusão
Você construiu uma pequena aplicação web para resenhas de livros que se comunica com um banco de dados PostgreSQL. Você tem funcionalidades básicas de banco de dados em sua aplicação Flask, como adicionar novos dados ao banco de dados, recuperar dados e exibi-los em uma página.
Se você gostaria de ler mais sobre Flask, confira os outros tutoriais na série Flask.