#python #html #flask
#python #HTML #flask
Вопрос:
Я хотел бы иметь периодическую задачу, которая рендерит html-файл и загружает его в s3 через boto.
Проблема с этим заключается в том, что, поскольку задача находится за пределами функции конечной точки (т. Е. оформлена app.route), контекст Flask отсутствует. Итак, когда моя задача выполняется и вызывается render_template, возникает исключение из-за отсутствия контекста:
Traceback ........
File "/usr/local/lib/python2.7/site-packages/flask/templating.py", line 126, in render_template
ctx.app.update_template_context(context)
AttributeError: 'NoneType' object has no attribute 'app'
Моя задача инициализируется примерно так, где я передаю функцию, которую хочу периодически выполнять:
HtmlUploader.new(
lambda: render_template('something.html', value=get_value())
).start()
Могу ли я каким-либо образом вызвать render_template вне функции конечной точки приложения?
Комментарии:
1. Я придумал решение, которое работает, но может быть не идеальным. ctx = app.test_request_context(«), и затем я могу использовать ctx в операторе with, чтобы предоставить мне контекст, который мне нужен для вызова render_template.
Ответ №1:
Для рендеринга шаблона с render_template()
требуется контекст запроса.
Вы можете легко создать его только для пакетного процесса:
def render_with_context(template, _url='/', **kw):
with app.test_request_context(url):
return render_template(template, **kw)
Это создает запрос ‘test’ для заданного URL (по умолчанию /
). Затем вы можете использовать это как:
HtmlUploader.new(
lambda: render_with_context('something.html', value=get_value())
).start()
Комментарии:
1. Да, это то, что я в конечном итоге обнаружил. Однако я не был уверен, что это лучшее решение.