Web-фреймворк Flask (Python): от простого к сложному

Раздел: Веб-разработка -> Веб-разработка

Основы Flask

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

Установка Flask выполняется через pip:

pip install flask

Html css js python (интеграция python с html, css, javascript)

Создайте файл app.py с простейшим приложением:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello, Flask!'

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

создание сайтов python django (создание веб-сайтов на django с использованием python)

Запустите скрипт:

python app.py

Python web django (web-фреймворк django)

Приложение будет доступно по адресу http://127.0.0.1:5000.

Как организовать обработку разных URL?

Для добавления новых маршрутов используются декораторы @app.route. Например:

@app.route('/about')
def about():
    return 'Это страница "О нас"'

@app.route('/user/<username>')
def user_profile(username):
    return f'Профиль пользователя {username}'

Python web flask (web-фреймворк flask)

Можно задать типы данных в URL:

@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'Пост с ID {post_id}'

Python web server (web-сервер на python)

Частая ошибка: забыть указать methods при обработке POST-запросов. По умолчанию Flask принимает только GET. Для POST нужно:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return 'Данные отправлены'
    return 'Форма входа'

Python 3 веб приложение (веб-приложение на python 3)

Как использовать HTML-шаблоны?

Flask использует шаблонизатор Jinja2. Создайте папку templates и файл index.html:

<!DOCTYPE html>
<html>
<head><title>Flask App</title></head>
<body>
  <h1>{{ title }}</h1>
  <p>Привет, {{ name }}!</p>
</body>
</html>

Python веб сервисы (веб-сервисы на python)

В Python-коде:

from flask import render_template

@app.route('/hello/<name>')
def hello(name):
    return render_template('index.html', title='Главная', name=name)

примеры python веб (примеры веб-разработки на python)

Jinja2 поддерживает циклы и условия:

<ul>
{% for item in items %}
  <li>{{ item }}</li>
{% endfor %}
</ul>

{% if user %}
  <p>Пользователь {{ user }} авторизован</p>
{% endif %}

создание сайта на python (создание сайта на python)

Ошибка TemplateNotFound возникает, если шаблон не найден в папке templates или указан неправильный путь. Проверьте наличие папки и регистр имени файла.

Также можно указать другую папку для шаблонов при создании приложения:

app = Flask(__name__, template_folder='templates')

Django python создание приложения (создание веб-приложения на django)

Как подключить статические файлы (CSS, JS, изображения)?

Поместите файлы в папку static. В шаблоне используйте функцию url_for:

<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
<script src="{{ url_for('static', filename='script.js') }}"></script>

библиотека django python (библиотека django для веб-разработки на python)

Можно создавать подпапки:

<img src="{{ url_for('static', filename='images/logo.png') }}" alt="Логотип">

Python django практика (практика django на python)

Если файлы не загружаются, проверьте путь относительно папки static. Flask автоматически обслуживает статику по умолчанию, но при изменении папки нужно указать параметр static_folder.

Как обработать форму и получить данные от пользователя?

Используйте объект request. Пример формы в шаблоне form.html:

<form method="post" action="{{ url_for('login') }}">
  <input type="text" name="username">
  <input type="password" name="password">
  <button type="submit">Войти</button>
</form>

Python index html (работа с index.html в python)

Обработчик:

from flask import request, redirect, url_for

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        # проверка данных
        if username == 'admin' and password == 'secret':
            return redirect(url_for('dashboard'))
        else:
            return 'Неверные данные', 401
    return render_template('form.html')

Если данные не передаются, убедитесь, что в форме установлен метод POST и атрибут name у полей. Для получения параметров из URL используйте request.args.get().

Как структурировать большое приложение с помощью Blueprints?

Blueprints позволяют разделить приложение на модули. Создайте файл auth.py:

from flask import Blueprint, render_template

auth = Blueprint('auth', __name__, template_folder='templates')

@auth.route('/login')
def login():
    return render_template('login.html')

@auth.route('/logout')
def logout():
    return 'Вы вышли'

В главном файле зарегистрируйте blueprint:

from auth import auth
app.register_blueprint(auth, url_prefix='/auth')

Теперь маршруты доступны по /auth/login и /auth/logout.

При импорте blueprint возможны циклические зависимости, если blueprint импортирует app. Решение: использовать фабрику приложений или вынести создание app в отдельную функцию.

Расширенные примеры с Flask

Ниже приведены детальные примеры кода с пояснениями и результатами.

1. Работа с базой данных SQLite через Flask-SQLAlchemy

Установите расширение:

Пример
pip install flask-sqlalchemy

Пример модели и CRUD-операций (файл app.py):

Пример
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

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

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}>'

# Создание таблиц в контексте приложения
with app.app_context():
    db.create_all()

@app.route('/add')
def add_user():
    new_user = User(username='john', email='john@example.com')
    db.session.add(new_user)
    db.session.commit()
    return f'Добавлен пользователь {new_user.username}'

@app.route('/users')
def list_users():
    users = User.query.all()
    return '<br>'.join([u.username for u in users])

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

Результат: При переходе на /add создается пользователь, на /users выводится список имен.

Добавлен пользователь john
john
alice

2. Обработка ошибок (404, 500)

Создайте кастомные страницы ошибок:

Пример
@app.errorhandler(404)
def not_found(error):
    return '<h1>Страница не найдена</h1>', 404

@app.errorhandler(500)
def internal_error(error):
    return '<h1>Ошибка сервера</h1>', 500

Можно использовать шаблоны:

Пример
@app.errorhandler(404)
def not_found(error):
    return render_template('404.html'), 404

Также можно настроить обработку общих исключений:

Пример
@app.errorhandler(Exception)
def handle_exception(e):
    # запись в лог
    app.logger.error(f'Unhandled exception: {e}')
    return 'Что-то пошло не так', 500

3. Использование сессий для хранения данных пользователя

Flask предоставляет объект session для хранения данных между запросами. Установите секретный ключ (обязательно):

Пример
app.secret_key = 'supersecretkey'

@app.route('/login')
def login():
    session['username'] = 'admin'
    return 'Вы вошли как admin'

@app.route('/profile')
def profile():
    if 'username' in session:
        return f'Привет, {session["username"]}'
    return 'Пожалуйста, войдите'

@app.route('/logout')
def logout():
    session.pop('username', None)
    return 'Вы вышли'

Сессии по умолчанию хранятся на стороне клиента (в cookie). Для безопасности используйте надежный секретный ключ.

Результат: После входа на /login, при обращении к /profile отображается имя пользователя.

4. Создание REST API с Flask

Возвращайте JSON с помощью jsonify:

Пример
from flask import jsonify, request

@app.route('/api/items', methods=['GET'])
def get_items():
    items = ['item1', 'item2']
    return jsonify({'items': items})

@app.route('/api/items', methods=['POST'])
def create_item():
    data = request.get_json()
    if not data:
        return jsonify({'error': 'No JSON provided'}), 400
    # обработка
    return jsonify({'message': 'Item created', 'data': data}), 201

Для тестирования используйте curl или Postman:

$ curl http://127.0.0.1:5000/api/items
{"items":["item1","item2"]}

$ curl -X POST -H "Content-Type: application/json" -d '{"name":"new"}' http://127.0.0.1:5000/api/items
{"message":"Item created","data":{"name":"new"}}

5. Использование 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

Теперь при изменении моделей можно автоматически обновлять схему базы данных.

6. Обработка загрузки файлов

Форма для загрузки:

Пример
<form method="post" enctype="multipart/form-data">
  <input type="file" name="file">
  <button type="submit">Загрузить</button>
</form>

Обработчик:

Пример
import os
from flask import request, redirect, url_for
from werkzeug.utils import secure_filename

UPLOAD_FOLDER = 'uploads'
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        if 'file' not in request.files:
            return 'Нет файла'
        file = request.files['file']
        if file.filename == '':
            return 'Файл не выбран'
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return 'Файл загружен'
    return render_template('upload.html')

Важно: функция secure_filename защищает от path traversal-атак.

Web-фреймворк Flask - comments

En
Python web flask (python)