Кеширование Gunicorn Flask Шаблоны Jinja2 при использовании render_template () - PullRequest
0 голосов
/ 14 марта 2020

До сих пор я использовал render_template () почти исключительно для моих flask маршрутов приложения. render_template () Это работало нормально при использовании flask напрямую:

<!-- demo_template.html -->
<!doctype html>

<form action="/">
  <label for="name">Name:</label>
  <input type="text" id="name" name="name">
  <input type="submit" value="Submit">
</form>

<title>Hello from Flask</title>
{% if name %}
  <h1>Hello {{ name }}!</h1>
{% else %}
  <h1>Hello, World!</h1>
{% endif %}

from flask import Flask, render_template, request, redirect

app = Flask(__name__)
DEBUG = 1
HOST = '0.0.0.0'
PORT = 8080

def append_to_file(filename, self):
    with open(filename, "a") as text_file:
        text_file.write("\n%s" % self)

@app.route('/')
def hello():
    args_dict = dict(request.args)
    if 'name' in args_dict.keys():
        append_to_file('templates/demo_template.html', '<p>'+args_dict['name']+'</p>')
    return render_template('demo_template.html',**args_dict)

if __name__ == '__main__':
    app.run(debug = DEBUG, host=HOST, port=PORT)

Как только я поставил Gunicorn перед этим, базовая функциональность работает, однако добавляемый контент (имя) не возвращается, пока работник не будет перезапущен. Похоже, что Gunicorn кэширует шаблон.

sudo gunicorn -b 0.0.0.0:8090 app_demo:app -w 1 --log-level=debug --reload

Перезапуск работника после каждого запроса (--max-запросы 1), чтобы перезагрузить шаблон и показать добавленное содержимое:

sudo gunicorn -b 0.0.0.0:8090 app_demo:app -w 1 --log-level=debug --reload --max-requests 1

Это ошибка в Gunicorn или это поведение ожидается. Я не видел ничего в документации Gunicorn относительно этого поведения. Есть ли способ сделать так, чтобы gunicorn читал файлы во время рендеринга без необходимости перезапуска работника?

Редактировать: Хорошо, теперь я нашел два решения этой проблемы.

  1. Использование Gunicorns - дополнительная перезагрузка опция
    • Быстрее
    sudo gunicorn -b 0.0.0.0:8090 app_demo:app -w 1 --log-level=debug --reload --reload-extra templates/demo_template.html
    
  2. В пределах Flask установлено app.jinja_env.auto_reload = True
    • Быстрее, чем при использовании --max-запросов 1, медленнее, чем при использовании параметра Gunicorn --reload-extra
    app = Flask(__name__)
    DEBUG = 1
    HOST = '0.0.0.0'
    PORT = 8080
    app.jinja_env.auto_reload = True
    

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Это, вероятно, 100% на стороне Flask. Flask не перезагружает шаблоны, если у вас установлен DEBUG (если вы не установили новую опцию TEMPLATES_AUTO_RELOAD).

Когда вы вызываете Flask через gunicorn, __name__ == '__main__' будет False, поэтому app.run() выиграно не вызывать (вместо этого обрабатывается gunicorn). Это обходит настройку DEBUG по этому пути.

Существует несколько способов настройки DEBUG за пределами app.run(). Обратитесь к Flask документам, чтобы узнать, какой из них лучше для вас.

0 голосов
/ 15 марта 2020
  1. Использование Gunicorns - reload-extra опция
    • Список шаблонов для просмотра
    sudo gunicorn -b 0.0.0.0:8090 app_demo:app -w 1 --log-level=debug --reload --reload-extra templates/demo_template.html
    
  2. В пределах Flask set app.jinja_env.auto_reload = True
    • Медленнее, чем при использовании опции Gunicorn --reload-extra
    app = Flask(__name__)
    DEBUG = 1
    HOST = '0.0.0.0'
    PORT = 8080
    app.jinja_env.auto_reload = True
    
...