Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Для чего нужен 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
| Аспект | Flask | Django |
|---|---|---|
| Размер | Микрофреймворк (~15KB) | Full-stack (~500KB) |
| Кривая обучения | Быстрая | Крутая |
| ORM | Нужна внешняя (SQLAlchemy) | Встроена Django ORM |
| Admin панель | Надо делать вручную | Встроена |
| Тестирование | Нужно настраивать | Встроено |
| Масштабируемость | Зависит от расширений | Встроена |
| Использование | API, микросервисы, прототипы | CMS, большие приложения |
Когда выбирать Flask
✅ Создание REST API ✅ Микросервисы в архитектуре microservices ✅ Быстрое прототипирование ✅ Легковесные приложения ✅ Когда нужна максимальная гибкость ✅ Интеграция с существующим кодом
❌ Большие enterprise приложения ❌ Когда нужна готовая admin панель ❌ Полные веб-приложения с аутентификацией и авторизацией
Flask — идеальный выбор для разработчиков, которые хотят полный контроль над архитектурой и не хотят переплачивать за ненужный функционал Django.