Configuração
App Mínima
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return 'Hello, World!'
Executar a App
pip install flask flask --app app run --debug # or: python -m flask run --debug
Estrutura do Projeto
app.pyPonto de entrada da aplicação
templates/Templates HTML Jinja2
static/CSS, JS, imagens
models.pyModelos de banco de dados
requirements.txtDependências Python
Rotas
Rotas Básicas
@app.route('/about') def about(): return render_template('about.html') @app.route('/user/') def profile(username): return f'User: {username}'
Variáveis de URL
<variable>String (padrão)
<int:id>Inteiro
<float:price>Float
<path:subpath>String com barras
<uuid:item_id>UUID
Métodos HTTP
@app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': return do_login() return render_template('login.html')
Construção de URL
from flask import url_for url_for('profile', username='alice') # => '/user/alice'
Templates
Renderizar Template
from flask import render_template @app.route('/posts') def posts(): items = get_posts() return render_template('posts.html', posts=items)
Sintaxe Jinja2
{{ variable }} {% if user %}Welcome, {{ user.name }}!{% endif %} {% for item in items %}
  • {{ item }}
  • {% endfor %}
    Herança de Template
    {# base.html #} {% block content %}{% endblock %} {# child.html #} {% extends "base.html" %} {% block content %}

    Page

    {% endblock %}
    Filtros Comuns
    |safeRenderizar HTML bruto
    |escapeEscapar string HTML
    |lengthContar itens
    |default('N/A')Fallback para vazio
    |tojsonSerializar para JSON
    Requisição e Resposta
    Objeto Request
    from flask import request request.method # 'GET', 'POST' request.args.get('q') # query string ?q=value request.form['name'] # form POST data request.json # parsed JSON body
    Propriedades do Request
    request.argsParâmetros de query string
    request.formDados POST de formulário
    request.jsonCorpo JSON parseado
    request.filesArquivos enviados
    request.headersHeaders HTTP
    request.cookiesValores de cookie
    Helpers de Resposta
    from flask import jsonify, redirect, make_response return jsonify({'status': 'ok'}) # JSON response return redirect(url_for('index')) # redirect resp = make_response('body', 200) resp.headers['X-Custom'] = 'value'
    Sessão
    from flask import session app.secret_key = 'your-secret-key' session['user_id'] = 42 uid = session.get('user_id')
    Formulários
    Integração WTForms
    pip install flask-wtf from flask_wtf import FlaskForm from wtforms import StringField, PasswordField from wtforms.validators import DataRequired
    Definir Formulário
    class LoginForm(FlaskForm): username = StringField('User', validators=[DataRequired()]) password = PasswordField('Pass', validators=[DataRequired()])
    Usar na View
    @app.route('/login', methods=['GET', 'POST']) def login(): form = LoginForm() if form.validate_on_submit(): user = form.username.data return redirect(url_for('dashboard')) return render_template('login.html', form=form)
    Formulário no Template
    {{ form.hidden_tag() }} {{ form.username.label }} {{ form.username() }} {{ form.password.label }} {{ form.password() }}
    Banco de Dados
    Configuração SQLAlchemy
    pip install flask-sqlalchemy from flask_sqlalchemy import SQLAlchemy app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db' db = SQLAlchemy(app)
    Definir Model
    class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), nullable=False) email = db.Column(db.String(120), unique=True) posts = db.relationship('Post', backref='author')
    Operações CRUD
    user = User(name='Alice', email='[email protected]') db.session.add(user) db.session.commit() User.query.filter_by(name='Alice').first() db.session.delete(user) db.session.commit()
    Queries Comuns
    Model.query.all()Todos os registros
    Model.query.get(id)Por chave primária
    .filter_by(name='X')Filtro de igualdade simples
    .filter(Model.age > 18)Filtro de expressão
    .order_by(Model.name)Ordenar resultados
    .limit(10).offset(20)Paginar resultados
    Blueprints
    Criar Blueprint
    from flask import Blueprint blog = Blueprint('blog', __name__, url_prefix='/blog') @blog.route('/') def index(): return render_template('blog/index.html')
    Registrar Blueprint
    # app.py from blog import blog app.register_blueprint(blog)
    Construção de URL no Blueprint
    url_for('blog.index') # => '/blog/' url_for('blog.post', id=5) # => '/blog/post/5'
    Estrutura do Blueprint
    url_prefixPrefixar todas as rotas do blueprint
    template_folderDiretório de templates personalizado
    static_folderArquivos estáticos específicos do blueprint
    @bp.before_requestExecutar antes de cada requisição do blueprint
    Tratamento de Erros
    Páginas de Erro Personalizadas
    @app.errorhandler(404) def not_found(e): return render_template('404.html'), 404 @app.errorhandler(500) def server_error(e): return render_template('500.html'), 500
    Abortar Requisições
    from flask import abort @app.route('/admin') def admin(): if not current_user.is_admin: abort(403) return render_template('admin.html')
    Exceções Personalizadas
    from werkzeug.exceptions import HTTPException class InsufficientFunds(HTTPException): code = 402 description = 'Insufficient funds'
    Logging
    app.logger.info('User %s logged in', username) app.logger.warning('Disk space low') app.logger.error('Payment failed: %s', err)
    Configuração
    Métodos de Config
    app.config['DEBUG'] = True app.config.from_object('config.ProductionConfig') app.config.from_envvar('APP_SETTINGS')
    Padrão de Classe Config
    class Config: SECRET_KEY = os.environ.get('SECRET_KEY') SQLALCHEMY_TRACK_MODIFICATIONS = False class DevConfig(Config): DEBUG = True SQLALCHEMY_DATABASE_URI = 'sqlite:///dev.db'
    Configurações Comuns
    SECRET_KEYChave de assinatura de sessão (obrigatória)
    DEBUGHabilitar modo debug
    TESTINGHabilitar modo de teste
    SQLALCHEMY_DATABASE_URIString de conexão com banco de dados
    MAX_CONTENT_LENGTHTamanho máximo de upload em bytes
    JSON_SORT_KEYSOrdenar chaves de saída JSON
    Extensões
    Extensões Populares
    Flask-SQLAlchemyIntegração ORM
    Flask-MigrateMigrações de banco com Alembic
    Flask-WTFTratamento de formulários com CSRF
    Flask-LoginGerenciamento de sessão de usuário
    Flask-MailEnvio de email
    Flask-CORSCompartilhamento de recursos de origem cruzada
    Flask-RESTfulConstrução de API REST
    Flask-CachingCache de resposta e função
    Flask-Login
    from flask_login import LoginManager, login_required login_manager = LoginManager(app) login_manager.login_view = 'login' @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id))
    Flask-Migrate
    from flask_migrate import Migrate migrate = Migrate(app, db) # flask db init (once) # flask db migrate -m "add users" # flask db upgrade