Flask — периодический рендеринг html без контекста

#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. Да, это то, что я в конечном итоге обнаружил. Однако я не был уверен, что это лучшее решение.