Запуск приложения Flask бесконечно - PullRequest
0 голосов
/ 08 января 2020

У меня простой сайт, который показывает текущую цену серебра. Как заставить его работать в бесконечном l oop, чтобы он продолжал обновлять цену после очистки с сайта silverseek.com после любого интервала (например, 10 сек? Я пытался работать с BackgroundScheduler, однако он выдает ошибку

Выполнение задания «серебро (триггер: интервал [0:00:10], следующий запуск в: 2020-01-08 17:56:27 IST)» пропущено: достигнуто максимальное количество запущенных экземпляров ( 1) Задание «серебро (триггер: интервал [0:00:10], следующий запуск в: 2020-01-08 17:56:37 IST)» вызвало исключительную трассировку (последний вызов был последним): файл «C : \ Users \ Abhi \ PycharmProjects \ Cricket \ venv \ lib \ site-packages \ apscheduler \ executors \ base.py ", строка 125, в run_job retval = job.fun c (* job.args, ** job. kwargs) Файл "C: / Users / Abhi / PycharmProjects / Cricket / inte rnet .py", строка 25, в серебре return render_template ('home. html', s = txt.get_text ()) Файл «C: \ Users \ Abhi \ PycharmProjects \ Cricket \ venv \ lib \ site-packages \ flask \ templating.py», строка 136, в render_template ctx.app.update_template_context (продолжение ext) AttributeError: у объекта 'NoneType' нет атрибута 'app'

Вот код.

from bs4 import BeautifulSoup
from selenium import webdriver
import time
from apscheduler.schedulers.background import BackgroundScheduler
from flask import Flask, render_template




app = Flask(__name__)


@app.route('/')
def silver():
    url = "http://silverseek.com/"
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--headless')
    driver = webdriver.Chrome(executable_path='C:/Users/Rags/Downloads/cd79/chromedriver.exe', options=chrome_options)
    driver.get(url)
    time.sleep(8)
    sil = driver.page_source
    bs = BeautifulSoup(sil, "lxml")
    elem = bs.find_all('div', class_='quote-container')
    for txt in elem:
        return render_template('home.html', s=txt.get_text())


sched = BackgroundScheduler(daemon=True)
sched.add_job(silver, 'interval', seconds=10)
sched.start()

if __name__ == "__main__":
    app.run()

1 Ответ

1 голос
/ 08 января 2020

Вы имеете в виду, что вы надеетесь автоматически обновить содержимое страницы sh в вашем браузере? - bruno desthuilliers 19 минут a go
@brunodesthuilliers Да, это была идея ... Надеюсь, я не совсем не прав в каком-то смысле.

Ммм ... Это то, что я подозревал - и это совсем не так. Протокол HTTP основан на цикле запрос / ответ - клиент отправляет запрос (чтобы ПОЛУЧИТЬ заданный URL-адрес или ПОСТАВИТЬ некоторые данные по указанному URL и т. Д. c), запрос направляется на сервер, сервер возвращает ответ (с кодом состояния, содержимым и заголовками), И ЦИКЛ ЗАКОНЧЕН. Сервер не поддерживает соединение с клиентом после отправки ответа.

На самом деле ваше приложение уже «работает вечно» - это то, что делают вызовы app.run() - ожидание поступления запросов Каждый раз, когда вы отправляете запрос (например, каждый раз, когда вы загружаете страницу в браузере), вызывается ваша функция silver(), а результат возвращается в виде ответа HTTP (flask заботится о том, чтобы обернуть его в правильный ответ). если необходимо). Конечно, после того, как браузер предоставит ответ (отображающий вашу «страницу»), больше ничего не произойдет - страница не будет магически обновлять sh сама. Но если вы вручную обновите sh (перезагрузите страницу - клавиша F5 для большинства браузеров), он отправит новый запрос, и вы получите актуальную информацию.

Если вы хотите, чтобы ваша страница продолжайте обновлять себя, вы должны либо заставить клиента (в данном случае ваш браузер) его повторно использовать, либо использовать более сложный протокол, такой как websockets et c (который поддерживает соединение между клиентом и сервером, чтобы сервер мог sh клиенту).

Для вашего случая это, безусловно, излишне, поэтому простое и очевидное решение - использовать клиентские сценарии - IOW javascript - для обновления sh страницы каждые X секунд. Это тривиально, и нет недостатка в примерах, поэтому я не буду публиковать их здесь.

Теперь, если это для целей обучения, вы все равно можете попробовать «более сложное» решение, чтобы вы получили первый пример того, как это работает (django имеет для этого 'django -каналы', и, безусловно, что-то похожее для flask), но я считаю, что вам лучше сначала узнать больше о самом HTTP, прежде чем переходить на эти более сложные темы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...