Как разбить приложение Flask на части
Введение | |
Предпосылки | |
Новый файл | |
Регистрация нового чертежа | |
url_for | |
open_resource | |
Другие статьи о Flask |
Введение
Разбиение приложения на части происходит с помощью чертежей - Blueprints.
Прочитать про них подробнее можно
здесь
.
В этой статье - руководство к действию
Предпосылки
У вас есть основной файл
__init__.py
или
app.py
в котором вы уже создали приложение Flask
Url обслуживаются с помощью @app.route
Допустим, у вас есть группа url вида
@app.route('/first/1', methods = ['GET'])
…
@app.route('/first/2', methods = ['GET'])
…
@app.route('/first/3', methods = ['GET'])
…
и группа url вида
@app.route('/second/1', methods = ['GET'])
…
@app.route('/second/2', methods = ['GET'])
…
@app.route('/second/3', methods = ['GET'])
…
Те url, которые начинаются на second
вы хотите выделить в отдельное подприложение, или просто хотите разбить
главный файл на части, чтобы было проще искать нужный код.
Нужно будет сделать несколько действий, первое из которых - создание нового .py файла
Новый файл
Создайте рядом с главным файлом новый файл
second.py
Импортируйте туда всё, что было нужно для работы + functools
Из flask обязательно импортируйте Blueprint
это ключевой модуль для данной операции.
import functools
from flask import (
Blueprint, flash, g, redirect, render_template, request, session, url_for
)
from werkzeug.security import check_password_hash, generate_password_hash
После импорта добавьте строку
bp = Blueprint('api', __name__, url_prefix='/second')
url_prefix='/second' означает, что все url в этом подприложении будут начинаться с second
Добавьте ваши url, но @app. замените на @bp. и second/ писать уже не нужно
@bp.route('/1', methods = ['GET'])
…
@bp.route('/2', methods = ['GET'])
…
@bp.route('/3', methods = ['GET'])
…
Файл second.py готов
Регистрация нового чертежа
Теперь в главном файле, скорее всего он называется
__init__.py
удалите перемещённые url
И зарегистрируйте новое подприложение прописав его чертёж
from . import second
app.register_blueprint(second.bp)
url_for
Вы, скорее всего, пользовались url_for и в оригинальном файле это выглядело примерно так:
{{ url_for('second/1') }}
То теперь нужно заменить / на .
{{ url_for('second.1') }}
Шаблоны для порядка тоже имеет смысл переложить в отдельную папку templates/
open_resource
Если раньше вы писали
with app.open_resource
теперь нужно писать
with bp.open_resource
Например:
def load_db():
with bp.open_resource('file.json') as f:
return json.load(f)