← Назад к вопросам

Для чего нужен Flask?

1.0 Junior🔥 161 комментариев
#FastAPI и Flask

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Для чего нужен Flask?

Flask — это лёгкий микрофреймворк для Python для создания веб-приложений и API. В отличие от Django с его батарейками, Flask даёт минимум функциональности и позволяет разработчику самому выбирать инструменты.

Основные характеристики

from flask import Flask, render_template, request, jsonify
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
CORS(app)  # Включить CORS
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://user:pass@localhost/db'
db = SQLAlchemy(app)

# Простой маршрут
@app.route('/hello')
def hello():
    return 'Hello, World!'

# JSON API
@app.route('/api/users', methods=['GET'])
def get_users():
    users = User.query.all()
    return jsonify([u.to_dict() for u in users])

# POST с данными
@app.route('/api/users', methods=['POST'])
def create_user():
    data = request.get_json()
    user = User(name=data['name'], email=data['email'])
    db.session.add(user)
    db.session.commit()
    return jsonify(user.to_dict()), 201

# Параметры в URL
@app.route('/api/users/<int:user_id>')
def get_user(user_id):
    user = User.query.get_or_404(user_id)
    return jsonify(user.to_dict())

# Шаблоны HTML
@app.route('/profile/<name>')
def profile(name):
    return render_template('profile.html', name=name)

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)

Где Flask используется

1. Прототипирование и MVP

Flask позволяет быстро создать работающий прототип без лишней конфигурации:

# Полный микро-API в 30 строк
from flask import Flask, jsonify
from datetime import datetime

app = Flask(__name__)
tasks = []

@app.route('/tasks', methods=['GET'])
def list_tasks():
    return jsonify(tasks)

@app.route('/tasks', methods=['POST'])
def add_task():
    from flask import request
    task = request.get_json()
    task['created'] = datetime.now().isoformat()
    tasks.append(task)
    return jsonify(task), 201

@app.route('/tasks/<int:task_id>', methods=['DELETE'])
def delete_task(task_id):
    global tasks
    tasks = [t for t in tasks if t.get('id') != task_id]
    return '', 204

if __name__ == '__main__':
    app.run()

2. Микросервисы

Flask идеален для легковесных микросервисов в архитектуре микросервисов:

# auth-service
from flask import Flask, request, jsonify
import jwt
from functools import wraps

app = Flask(__name__)
SECRET_KEY = 'secret-key'

def token_required(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        token = request.headers.get('Authorization')
        if not token:
            return {'message': 'Token missing'}, 401
        try:
            data = jwt.decode(token.split(' ')[1], SECRET_KEY, algorithms=['HS256'])
            request.user_id = data['user_id']
        except jwt.InvalidTokenError:
            return {'message': 'Invalid token'}, 401
        return f(*args, **kwargs)
    return decorated

@app.route('/auth/login', methods=['POST'])
def login():
    data = request.get_json()
    # Проверка credentials
    token = jwt.encode(
        {'user_id': user_id, 'exp': datetime.now() + timedelta(hours=24)},
        SECRET_KEY,
        algorithm='HS256'
    )
    return jsonify({'token': token})

@app.route('/auth/verify', methods=['POST'])
@token_required
def verify():
    return jsonify({'user_id': request.user_id, 'valid': True})

3. REST API

Flask отлично подходит для создания REST API:

from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
db = SQLAlchemy(app)

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(255), nullable=False)
    content = db.Column(db.Text)
    author = db.Column(db.String(100))
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    
    def to_dict(self):
        return {
            'id': self.id,
            'title': self.title,
            'content': self.content,
            'author': self.author,
            'created_at': self.created_at.isoformat()
        }

# RESTful CRUD
@app.route('/api/posts', methods=['GET'])
def list_posts():
    page = request.args.get('page', 1, type=int)
    per_page = request.args.get('per_page', 10, type=int)
    posts = Post.query.paginate(page=page, per_page=per_page)
    return jsonify({
        'items': [p.to_dict() for p in posts.items],
        'total': posts.total,
        'pages': posts.pages
    })

@app.route('/api/posts/<int:post_id>', methods=['GET'])
def get_post(post_id):
    post = Post.query.get_or_404(post_id)
    return jsonify(post.to_dict())

@app.route('/api/posts', methods=['POST'])
def create_post():
    data = request.get_json()
    post = Post(title=data['title'], content=data['content'], author=data.get('author'))
    db.session.add(post)
    db.session.commit()
    return jsonify(post.to_dict()), 201

@app.route('/api/posts/<int:post_id>', methods=['PUT'])
def update_post(post_id):
    post = Post.query.get_or_404(post_id)
    data = request.get_json()
    post.title = data.get('title', post.title)
    post.content = data.get('content', post.content)
    db.session.commit()
    return jsonify(post.to_dict())

@app.route('/api/posts/<int:post_id>', methods=['DELETE'])
def delete_post(post_id):
    post = Post.query.get_or_404(post_id)
    db.session.delete(post)
    db.session.commit()
    return '', 204

4. Real-time приложения с WebSocket

from flask import Flask
from flask_socketio import SocketIO, emit, join_room, leave_room

app = Flask(__name__)
socketio = SocketIO(app, cors_allowed_origins="*")

@socketio.on('connect')
def handle_connect():
    print(f'Client connected: {request.sid}')

@socketio.on('join')
def on_join(data):
    room = data['room']
    join_room(room)
    emit('message', {'text': f'User {request.sid} joined room {room}'}, to=room)

@socketio.on('send_message')
def on_message(data):
    room = data['room']
    message = data['message']
    emit('message', {'text': message, 'sender': request.sid}, to=room)

@socketio.on('disconnect')
def handle_disconnect():
    print(f'Client disconnected: {request.sid}')

if __name__ == '__main__':
    socketio.run(app, debug=True, host='0.0.0.0', port=5000)

Flask vs Django

АспектFlaskDjango
РазмерМикрофреймворк (~15KB)Full-stack (~500KB)
Кривая обученияБыстраяКрутая
ORMНужна внешняя (SQLAlchemy)Встроена Django ORM
Admin панельНадо делать вручнуюВстроена
ТестированиеНужно настраиватьВстроено
МасштабируемостьЗависит от расширенийВстроена
ИспользованиеAPI, микросервисы, прототипыCMS, большие приложения

Когда выбирать Flask

✅ Создание REST API ✅ Микросервисы в архитектуре microservices ✅ Быстрое прототипирование ✅ Легковесные приложения ✅ Когда нужна максимальная гибкость ✅ Интеграция с существующим кодом

❌ Большие enterprise приложения ❌ Когда нужна готовая admin панель ❌ Полные веб-приложения с аутентификацией и авторизацией

Flask — идеальный выбор для разработчиков, которые хотят полный контроль над архитектурой и не хотят переплачивать за ненужный функционал Django.