#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. Я думал об этом решении, но оно мне не очень понравилось, потому что вы передаете все глобальные переменные и переменные приложения, где многие из них могут быть неиспользуемыми. Но я думаю, что, возможно, я просто переосмысливаю проблему, и это не так уж важно. Спасибо вам за ваш ответ.