🔖 Справочник: Flask-проект

⚡ Главные команды

# Установка зависимостей
pip install flask flask-sqlalchemy flask-migrate pydantic

# Запуск приложения
flask run
python run.py

# Миграции (Flask-Migrate)
flask db init
flask db migrate -m "initial"
flask db upgrade

Установка пакетов

pip install flask flask-sqlalchemy flask-migrate pydantic

Blueprint — создание и регистрация

# Создание
from flask import Blueprint
bp = Blueprint('name', __name__)

# Маршрут в Blueprint
@bp.route('/path', methods=['GET', 'POST'])
def view():
    ...

# Регистрация в app с префиксом
app.register_blueprint(bp, url_prefix='/prefix')

Application Factory

# app/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def create_app(config_name='development'):
    app = Flask(__name__)
    app.config.from_object(config_map[config_name])
    db.init_app(app)
    # регистрация blueprints...
    return app

Классы конфигурации

# config.py
class Config:
    DEBUG = False
    TESTING = False
    SQLALCHEMY_DATABASE_URI = 'sqlite:///app.db'
    SQLALCHEMY_TRACK_MODIFICATIONS = False

class DevelopmentConfig(Config):
    DEBUG = True

class TestingConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'

class ProductionConfig(Config):
    pass

config_map = {
    'development': DevelopmentConfig,
    'testing': TestingConfig,
    'production': ProductionConfig,
}

Роутинг — ключевые паттерны

# Простой маршрут
@app.route('/')
def index(): ...

# Переменные в URL
@app.route('/items/<int:item_id>')
def get_item(item_id): ...

# Несколько HTTP-методов
@app.route('/items', methods=['GET', 'POST'])
def items(): ...

# Путь со слэшами
@app.route('/files/<path:filename>')
def serve_file(filename): ...

# UUID
@app.route('/users/<uuid:user_id>')
def get_user(user_id): ...

request — объект запроса

from flask import request

request.method          # 'GET', 'POST', ...
request.get_json()      # тело JSON
request.args.get('q')   # query-параметр ?q=...
request.form.get('key') # форма

jsonify — формирование ответа

from flask import jsonify

return jsonify({"key": "value"})         # 200 OK
return jsonify({"error": "not found"}), 404
return jsonify({"created": data}), 201

Flask-SQLAlchemy — модели

from app import db

class Question(db.Model):
    __tablename__ = 'questions'

    id = db.Column(db.Integer, primary_key=True)
    text = db.Column(db.String(500), nullable=False)
    responses = db.relationship('Response', backref='question', lazy=True)

class Response(db.Model):
    __tablename__ = 'responses'

    id = db.Column(db.Integer, primary_key=True)
    question_id = db.Column(db.Integer, db.ForeignKey('questions.id'), nullable=False)
    agree = db.Column(db.Boolean, nullable=False)  # True = согласен
Современный стиль SQLAlchemy 2.x рекомендует Mapped + mapped_column вместо db.Column. Если используете Flask-SQLAlchemy 3.x, проверьте документацию. ⚠️ Проверить по документации Flask-SQLAlchemy 3.x

CRUD через Flask-SQLAlchemy

# Create
new_q = Question(text="Согласны ли вы с утверждением X?")
db.session.add(new_q)
db.session.commit()

# Read
questions = Question.query.all()           # устаревший стиль 1.x
from sqlalchemy import select              # современный стиль 2.x
questions = db.session.scalars(select(Question)).all()

# Update
q = db.session.get(Question, question_id)
q.text = "Новый текст"
db.session.commit()

# Delete
db.session.delete(q)
db.session.commit()

Pydantic-схемы

from pydantic import BaseModel, Field

class QuestionCreate(BaseModel):
    text: str = Field(..., min_length=5, max_length=500)

class QuestionOut(BaseModel):
    id: int
    text: str

    model_config = {"from_attributes": True}  # Pydantic v2

Миграции (Flask-Migrate)

pip install flask-migrate

# app/__init__.py
from flask_migrate import Migrate
migrate = Migrate()

def create_app():
    ...
    migrate.init_app(app, db)
    ...

# Команды в терминале
flask db init        # первоначальная инициализация
flask db migrate -m "add category table"
flask db upgrade     # применить миграцию
flask db downgrade   # откатить миграцию