【问题标题】:Running a Flask application infinitely无限运行 Flask 应用程序
【发布时间】:2020-04-26 00:06:34
【问题描述】:

我正在运行一个显示当前白银价格的简单网站。如何让它在无限循环中运行,以便在任何时间间隔(例如 10 秒)后从 silverseek.com 抓取价格后不断更新价格?我尝试使用 BackgroundScheduler,但是,它会引发错误

跳过作业“silver(触发器:interval[0:00:10],下次运行时间:2020-01-08 17:56:27 IST)”的执行:最大运行实例数 达到 (1) 作业“silver(触发器:interval[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.func(*job.args, **job.kwargs) 文件“C:/Users/Abhi/PycharmProjects/Cricket/internet.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(上下文) 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()

【问题讨论】:

  • 能否请您添加完整的回溯?
  • @Shiva 完成。请检查。
  • 好吧,实际上你几乎不会“更错”——但至少你会学到一些东西 xD
  • @RakeshGulati,不客气——每个人都必须从某个地方开始,走错路总比什么都不做要好。至少你自己先尝试过 ;-)
  • 顺便说一句,您可能在这里学到的第一件事是尽可能清楚地解释您真正试图解决的问题(而不是只提及您的想法是解决方案),特别是当你刚开始并且不一定有适当的词汇时。 FWIW 这被称为“XY 问题”(用户只询问 X,但他们真正的问题是 Y,而 X 不是 Y 的解决方案)。

标签: python flask


【解决方案1】:

您的意思是您希望页面内容在您的浏览器中自动刷新? – bruno desthuilliers 19 分钟前
@brunodesthuilliers 是的,就是这个想法..我希望我在某些方面不是完全错误的。

嗯...这就是我所怀疑的 - 这根本不是它的工作原理。 HTTP 协议基于请求/响应周期 - 客户端发送请求(获取给定的 url,或在给定的 URL 上发布一些数据等),请求被路由到服务器,服务器返回响应(使用状态码、内容和标题),然后循环结束。发送响应后,服务器不会与客户端保持任何连接。

实际上,您的应用程序已经“永远运行” - 这就是 app.run() 调用所做的 - 等待请求进入。每次发送请求时(例如每次在浏览器中加载页面时),你的 silver() 函数被调用,结果作为 HTTP 响应返回(flask 会在必要时将其包装在适当的响应中)。当然,一旦浏览器呈现响应(显示您的“页面”),就不会发生其他任何事情 - 页面不会神奇地自行刷新。但是如果你手动刷新它(重新加载页面 - 大多数浏览器的 F5 键),它会发送一个新的请求,然后你会得到最新的信息。

如果你想让你的页面不断刷新,你要么必须让客户端(在这种情况下是你的浏览器)刷新它,要么使用更复杂的协议,如 websockets 等(保持客户端和服务器之间的连接的东西所以服务器可以推送到客户端)。

对于您的情况,这肯定是矫枉过正,所以简单明显的解决方案是使用客户端脚本 - IOW javascript - 每 X 秒刷新一次页面。这是微不足道的,并且不乏示例,所以我不会在这里发布一个。

现在,如果这是出于学习目的,您可能仍然想尝试“更复杂”的解决方案,以便您初步了解它的工作原理(django 有 'django-channels' 为此,而且肯定有烧瓶类似的东西),但我认为你最好先更多地了解 HTTP 本身,然后再继续讨论那些更高级的主题。

【讨论】:

  • 非常感谢。再好不过了。我现在意识到我的方法中的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 2022-01-15
相关资源
最近更新 更多