Flask: разработка веб-приложений с нуля
Основы веб-приложения на Flask
Flask - это микрофреймворк для Python, который позволяет быстро создавать веб-приложения. Основное решение включает установку, создание минимального приложения, определение маршрутов и шаблонов. Установка:
pip install flaskPython flask веб приложение (веб-приложение на flask)
Пример простейшего приложения app.py:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return "<h1>Hello, Flask!</h1>"
if __name__ == '__main__':
app.run(debug=True)Запуск: python app.py. При переходе на http://127.0.0.1:5000/ вы увидите приветствие. Режим debug позволяет автоматически перезагружать сервер при изменениях кода и выводить подробные ошибки.
Как организовать код с помощью Blueprints?
Blueprints позволяют модульно разделять приложение на части. Вариант: создать blueprint для админки и отдельно для публичной части.
# admin.py
from flask import Blueprint
admin_bp = Blueprint('admin', __name__)
@admin_bp.route('/admin')
def admin_panel():
return "Admin Panel"
# app.py
from flask import Flask
from admin import admin_bp
app = Flask(__name__)
app.register_blueprint(admin_bp, url_prefix='/admin')Как обрабатывать формы и валидировать данные?
Используйте расширение Flask-WTF. Установка: pip install flask-wtf. Пример формы:
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
class MyForm(FlaskForm):
name = StringField('Name', validators=[DataRequired()])
submit = SubmitField('Submit')В шаблоне form.html:
<form method="POST">
{{ form.hidden_tag() }}
{{ form.name.label }} {{ form.name(size=20) }}
<br>
{{ form.submit() }}
</form>Проблема: секретный ключ. app.config['SECRET_KEY'] = 'your-secret-key' обязателен.
Как подключить базу данных SQLite с SQLAlchemy?
Установка: pip install flask-sqlalchemy. Пример модели User:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return f'<User {self.username}>'В app.py инициализация:
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db.init_app(app)
with app.app_context():
db.create_all()Типичные ошибки и их решения
Ошибка: ImportError при циклических импортах. Решение: используйте отложенный импорт внутри функций или реструктурируйте код. Например, определение моделей перенесите в отдельный файл models.py и импортируйте db оттуда.
Ошибка: TemplateNotFound. Убедитесь, что папка templates находится в корне проекта. Если используете blueprint, укажите template_folder.
Проблема: не работает debug при запуске из IDE. Настройте переменную окружения FLASK_ENV=development или установите app.run(debug=True).
Расширенные примеры использования Flask
1. REST API с Flask-RESTful
Установка: pip install flask-restful. Создайте ресурс для работы с пользователями.
from flask import Flask
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
class UserResource(Resource):
def get(self, user_id):
return {'user_id': user_id, 'name': 'John'}
api.add_resource(UserResource, '/api/user/<int:user_id>')
if __name__ == '__main__':
app.run(debug=True)Результат запроса GET /api/user/42:
{
"user_id": 42,
"name": "John"
}2. Аутентификация с Flask-Login
Установка: pip install flask-login. Пример менеджера пользователей:
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user
login_manager = LoginManager()
login_manager.init_app(app)
class User(UserMixin):
def __init__(self, id):
self.id = id
@login_manager.user_loader
def load_user(user_id):
return User(user_id)
@app.route('/login')
def login():
user = User(1)
login_user(user)
return 'Logged in!'
@app.route('/protected')
@login_required
def protected():
return 'This is protected.'3. Работа с Flask-Migrate (миграции БД)
Установка: pip install flask-migrate. Инициализация:
from flask_migrate import Migrate
migrate = Migrate(app, db)
# В терминале:
# flask db init
# flask db migrate -m "Initial migration."
# flask db upgrade4. Использование контекстов запроса и приложения
Пример работы с current_app и request:
from flask import current_app, request
@app.route('/info')
def info():
user_agent = request.headers.get('User-Agent')
app_name = current_app.name
return f'You are using {user_agent} on app {app_name}'5. Тестирование приложения
Используйте pytest и клиент Flask для тестирования маршрутов:
import pytest
from app import app
@pytest.fixture
def client():
app.config['TESTING'] = True
with app.test_client() as client:
yield client
def test_index(client):
response = client.get('/')
assert response.status_code == 200
assert b'Hello, Flask!' in response.data6. Контейнеризация с Docker
Dockerfile для Flask приложения:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]Файл requirements.txt:
flask
flask-sqlalchemy
flask-wtf
flask-login