Blueprint — упрощает организацию путей на Flask.
Этот материал из цикла статей по разработке сайтов на python: от локальной разработки до развертывания на удаленном сервере.
Упрощенный вид кода для работы сайта на Flask:
Стандартный Flask
app = Flask(__name__)
app.config.from_object('config.DevConfig')
# Website routes
@app.route('/')
def home():
return "Home"
# Admin pages
@app.route('/portfolio')
def portfolio_home():
return "portfolio Home"
if __name__ == "__main__":
app.run()
Отсюда нам интересны только роуты (route). Мы можем эти роуты вынести в отдельный файл. Это нормальная практика даже для небольшого проекта. Однако что делать, если роутов слишком много?
Для этих целей подходит распределение роутов через Blueprint.
Роуты через Blueprint
В файле app/__init__.py подключаем несколько файлов routes.py:
from app.routes import main_bp
app.register_blueprint(main_bp, url_prefix="/")
from app.admin.routes import admin_bp
app.register_blueprint(admin_bp, url_prefix="/admin")
Как видно выше, у нас два файла routes.py в двух директориях. Для главной страницы это файл app/routes.py. Для страницы админки это файл app/admin/routes.py.
app/routes.py
Содержимое файла:
from flask import Blueprint, render_template
main_bp = Blueprint('main_blueprint', __name__)
# Include main page
# Подключение главной страницы
@main_bp.route('/')
def portfolio_home_route():
# return 'Сайт работает.'
return flask.redirect("/admin/")
return render_template('/admin/index.html')
app/portfolio/routes.py
Содержимое файла:
# Получение списка всех названий когда-либо купленных акций
@portfolio_bp.route('/get-user/', methods=['GET'])
@login_required
def get_all_user_shares_route():
query = db.session.query(Portfolio.name).filter_by(user_id=flask_login.current_user.id)
shares = [x.name for x in query.all()]
return json.dumps(shares)