Передайте свойства приложения Flask в проект Flask с помощью шаблона Jinja

#python #flask

Вопрос:

У меня есть приложение для колбы большего размера, и я хочу использовать чертежи для более чистого дизайна. Текущий код выглядит следующим образом:

main_app.py :

 app = Flask(__name__)
# ... some config passing to app ...
app.register_blueprint(user_management, url_prefix="/user")
 

и user_management.py

 user_management = Blueprint("user_management", __name__, static_folder="static", template_folder="templates")

@user_management.route("/register")
def register_user():
    register_form = UserRegistrationForm()
    return render_template('user_registration.html', title="...", form=register_form)
 

Проблема , которую я в настоящее время пытаюсь решить, заключается в том, что у меня есть базовый шаблон Jinja layout.html , который используется в чертежах шаблона Jinja user_registration.html , подобного этому:

 {# user_registration.html #}
{% extends "layout.html" %}
 

Но layout.html он использует некоторые глобальные переменные Flask app via flask.g , а также конфигурацию app . Когда я пытаюсь загрузить страницу с user_registration.html шаблоном ( /user/register ), он выводит ошибку:

 jinja2.exceptions.UndefinedError: 'ac' is undefined
 

ac Переменная определяется внутри другого маршрута в main_app.py like g.ac = "..." . Мне удалось решить эту проблему , добавив параметр для визуализации шаблона внутри register_user() метода as render_template(..., ac=g.ac) , но это не очень элегантный способ решения этой проблемы, потому что есть также некоторые другие переменные, такие как конфигурация app (также используется в layout.html ), что приводит к еще одной ошибке:

 jinja2.exceptions.UndefinedError: 'flask.config.Config object' has no attribute 'login'
 

Должен быть какой-то лучший способ решения этой проблемы и передачи базовых app атрибутов и глобальных переменных из flask.g шаблона blueprint Jinja. Я прочитал несколько тем, но не могу найти аналогичную проблему.

Комментарии:

1. Вы можете создать контекстный словарь и передать его в шаблон в качестве одного аргумента. Этот контекст диктует, может содержать все глобальные значения и конкретные вещи экземпляра приложения. Вы можете использовать приложение flask.current_app внутри функций просмотра для доступа к текущему экземпляру приложения flask.

2. Я думал об этом решении, но оно мне не очень понравилось, потому что вы передаете все глобальные переменные и переменные приложения, где многие из них могут быть неиспользуемыми. Но я думаю, что, возможно, я просто переосмысливаю проблему, и это не так уж важно. Спасибо вам за ваш ответ.