Веб: Как часто обновляется Flask / JS?

спросил: 28 марта 2018 в 02:44 в: javascript

Я пытаюсь отображать изображения в реальном времени только на моей машине. Подумайте, действительно ли базовая версия Google Images. Пользователь вводит "красный молоток", и я показываю им изображение красного молота.

Проблема - это частота обновления. Я обновляю файл изображения, который будет показан, и когда я просматриваю его непосредственно как http://127.0.0.1:6007/static/tree.jpg, это немедленно даст мне самый последний jpg. И затем, как ни странно, после того, как я посмотрю что-то вроде http://127.0.0.1:6007/static/tree.jpg, изображение меняется на начальную http://127.0.0.1:6007!

Моя настройка:

В каталоге static/ tree.jpg:

показать .html

В templates/, show.html:

<!DOCTYPE html>
<html>
  <body>
    <h1>Text-to-Image Synthesis</h1>
    <form method="POST" action="/generator">
      <p>Input to Generator: <input type="text" name="input_text"><input type="submit" value="Generate Image"></p>
    </form>
    <img src="{{url_for('static', filename='tree.jpg')}}" />
  </body>
</html>

index.html

и index.html:

<!DOCTYPE html>
<html>
  <body>
    <h1>Text-to-Image Synthesis</h1>
    <form method="POST" action="/generator">
<!-- button  -->
      <p>Input to Generator: <input type="text" name="input_text"><input type="submit" value="Generate Image"></p>
    </form>
  </body>
</html>

Эти два значения совпадают, кроме show.html отображается изображение в строке src=....

#!/usr/bin/env python2.7import os
from flask import Flask, request, render_template, g, redirect, Response, send_from_directorytmpl_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates')
app = Flask(__name__, template_folder=tmpl_dir)@app.route('/')
def index():
    return render_template("index.html")@app.route('/generator', methods=['POST'])
def generator():
    # save typed-in text
    text = request.form['input_text']
    filename = "/home/ubuntu/icml2016/scripts/cub_queries.txt"
    with open(filename, "a+") as f:
        f.write(text + "\n")    """
    print('start')
    subprocess.call('./scripts/demo_cub.sh', shell=True) # change the image in the background
    print('end')
    """    return render_template("show.html")if __name__ == "__main__":
    HOST='0.0.0.0'
    PORT=6007
    app.run(host=HOST, port=PORT)

Итак, если я правильно дал вам все, вы должны иметь возможность вызвать python3 server.py и увидеть это:

и если вы введете "привет" в поле, это покажет это:

, но когда я меняю tree.jpg на другое изображение в фоновом режиме и набираю что-то еще, я не получаю e мгновенное обновление изображения, которое я ищу. Другими словами, это дерево не станет самым последним деревом: (Мы хотим увидеть прекрасное лицо Мори на моей основной веб-странице.

1 ответ

fasta ответил: 28 марта 2018 в 07:58

Ваша проблема связана с кэшированием http - прочитайте о заголовке http Expires. По умолчанию для колбы устанавливается заголовок Expires, равный 12 часам. Это сообщает вашему веб-браузеру, что нет необходимости снова запрашивать tree.jpg в течение 12 часов. Когда вашему браузеру снова понадобится tree.jpg, он просто загрузит его из кеша, даже не отправит запрос на ваш сервер. Ручной ввод этого tree.jpg URL в ваш браузер отменяет это, при этом вы просите свой браузер запросить его снова.

Похоже, вы не предоставили соответствующий код - send_from_directory вызов, обслуживающий ваш статический файл, - это то, где вам нужно внести изменения.

send_from_directory(directory, filename, cache_timeout=0)

Соответствующая документация:

  • http://flask.pocoo.org/docs/0.12/api/#flask.send_from_directory
  • http://flask.pocoo.org/docs/0.12/api/#flask.send_file
  • и send_file_max_age на одной странице (срок действия по умолчанию)
user9588242 ответил: 28 марта 2018 в 10:18
Я не использую send_from_directory(). Я использую render_from_template() и жестко кодирую файл. Но, возможно, я должен использовать вместо этого send_from_directory()? render_from_template() не имеет упомянутого вами флага cache_timeout
fasta ответил: 28 марта 2018 в 11:07
О да. Я не буду использовать метод шаблона рендеринга в двоичном файле. Это создает ненужную работу. Вы явно импортировали send_from_directory - я думал, что у вас, должно быть, был / статический маршрут, использующий это. Это будет проблема Expires. Хороший способ отладки - инструменты разработчика Chrome. Используйте временную шкалу сети для проверки заголовков каждого запроса / ответа.
user9588242 ответил: 28 марта 2018 в 11:25
Сейчас я пытаюсь использовать flask_cache.Cache и очищать его вручную с помощью cache.clear() каждый раз, когда мне нужно повторно выполнить render_template('show.html'). Но это не работает. Инструменты разработчика работали, но это не будет разрешено, когда я представлю этот проект
user9588242 ответил: 28 марта 2018 в 11:26
Причина, по которой я часто использую render_template(), заключается в том, что я хочу отображать текстовое поле и загруженное изображение каждый раз
fasta ответил: 28 марта 2018 в 12:01
Способ реализации клиента должен получать два файла для каждого обновления - show.html и .jpg. Это два http запроса. В настоящее время ваш браузер часто кэширует запрос .jpg, поэтому не запрашивает его снова у сервера. Чтобы клиентский веб-браузер всегда снова запрашивал изображение, необходимо установить заголовок, указывающий, что срок действия файла истек.