Flask: разработка веб-приложений с нуля

Раздел: Веб-разработка -> Фреймворки (Flask)

Основы веб-приложения на Flask

Flask - это микрофреймворк для Python, который позволяет быстро создавать веб-приложения. Основное решение включает установку, создание минимального приложения, определение маршрутов и шаблонов. Установка:

pip install flask

Python 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 upgrade

4. Использование контекстов запроса и приложения

Пример работы с 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.data

6. Контейнеризация с 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

Веб-приложение на Flask - comments

En
Python flask веб приложение (python)