Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Sugestão] Container rodando e parando (falta completar o código Python)

A transcrição do código do arquivo app.py está incompleta:

from flask import Flask, request, redirect, render_template_string
import sqlite3
import os

app = Flask(__name__)

DB_PATH = os.environ.get("DB_PATH", "data/app.db")

def init_db():
    os.makedirs(os.path.dirname(DB_PATH), exist_ok=True)
    conn = sqlite3.connect(DB_PATH)
    c = conn.cursor()
    c.execute('CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY, name TEXT)')
    conn.commit()
    conn.close()

@app.route("/", methods=["GET", "POST"])
def index():
    init_db()
    # Terminou aqui.

Como não temos o código para iniciar a aplicação (app.run), o container apenas executa o arquivo e pára.

Completei o código desta forma:

# app.py
from flask import Flask, request, redirect, render_template_string
import sqlite3
import os

app = Flask(__name__)

DB_PATH = os.environ.get("DB_PATH", "data/app.db")

def init_db():
    os.makedirs(os.path.dirname(DB_PATH), exist_ok=True)
    conn = sqlite3.connect(DB_PATH)
    c = conn.cursor()
    c.execute('CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY, name TEXT)')
    conn.commit()
    conn.close()

@app.route("/", methods=["GET", "POST"])
def index():
    # init_db() # Inicialização movida para antes de rodar o app.
    with sqlite3.connect(DB_PATH) as conn:
        c = conn.cursor()
        if request.method == 'POST':
            name = request.form.get('name')
            c.execute(f"INSERT INTO items (name) VALUES('{name}')")
            conn.commit()
            return redirect('/')

        items=c.execute('SELECT * FROM items;')
    return render_template_string("""
    <h1>Itens</h1>
    <form method="post">
        <input name="name" placeholder="Novo item">
        <button type="submit">Adicionar</button>
    </form>
    <ul>
        {% for id, name in items %}
            <li>{{ id }} - {{ name }}</li>
        {% endfor %}
    </ul>
    """, items=items)

if __name__ == '__main__':
    init_db()
    app.run(host='0.0.0.0', port=3000)

:) Espero ter ajudado.

1 resposta

Olá, Thiago! Como vai?

Obrigado pela excelente sugestão.

Vi que você explorou o Flask para criar uma aplicação web em Python, utilizou muito bem o SQLite para persistência simples de dados e ainda compreendeu a importância da inicialização do banco e execução do servidor com app.run para garantir que o container não finalize imediatamente.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Separar lógica de banco: criar funções específicas para inserir e listar itens.
  • Adicionar tratamento de erros: capturar exceções de banco e retornar mensagens amigáveis.
  • Usar templates: substituir render_template_string por render_template com arquivos HTML.

Continue postando as suas soluções! Além de ganhar pontos de XP na plataforma, você pode ajudar outros estudantes no fórum.

Alguns materiais podem estar em inglês, mas é possível compreendê-los usando o recurso de tradução de páginas do próprio navegador.

Ah, uma pergunta: O que você acha mais interessante evoluir neste projeto, adicionar templates HTML para melhorar a interface ou manter o foco apenas na lógica de persistência e rotas?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!