🔖 Справочник: 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 # откатить миграцию