在基于 Flask 的网站上显示不断变化的 Python 变量

Display changing Python Variables on a Flask Based Website

目前正在构建一个 Python3.6 基于 Flask 的网站,托管在 Flask 服务器上,并在一个地方提供从网络上其他来源获取的产品的实时价格,以便于比较。

我有一个 scraper.py 文件,它使用 BeautifulSoup4 抓取网络信息。包含此信息的变量被导入到名为 app.py 的文件中,该文件包含作为模块的烧瓶脚本(来自 scraper.py 导入 X、Y、Z)。 X、Y、Z 变量通过 flask 传递到网页并通过 jinja 2 语法显示:
<p> {{ X }} </p>

问题是 scraper.py 仅在 flask 服务器启动时执行一次。但是我需要以设定的时间间隔更新变量,以便显示最新信息。

如果有人可以通过提供我可以建立的灵魂来帮助我,那就太好了。我从来没有使用过 AJAX 所以理想的解决方案应该包括 Python/Flask.

App.py:

        # Import Modules Here:
    import markdown
    import os
    import datetime

    # Import Flask Framework Here:
    from flask import Flask, flash, redirect, render_template, request, session, abort, url_for
    app = Flask(__name__)

    # Import Variables From ScrprAG.py:
    from ScprAG import AG_GRAM_SPOT, AG_OUNCE_SPOT, GLDAG_BRITANNIA, GLDAG_MAPLE, GLDAG_PHILHARMONIC, BBPAG_BRITANNIA, BBPAG_MAPLE, BBPAG_PHILHARMOIC

    # ./Home Script + Portfolio Page:
    @app.route("/")
    @app.route("/index")
    def index():
        return render_template('index.html', AG_GRAM_SPOT_WEB=AG_GRAM_SPOT, AG_OUNCE_SPOT_WEB=AG_OUNCE_SPOT, GLDAG_BRITANNIA_WEB=GLDAG_BRITANNIA, BBPAG_BRITANNIA_WEB=BBPAG_BRITANNIA, GLDAG_PHILHARMONIC_WEB=GLDAG_PHILHARMONIC, BBPAG_PHILHARMOIC_WEB=BBPAG_PHILHARMOIC, GLDAG_MAPLE_WEB=GLDAG_MAPLE, BBPAG_MAPLE_WEB=BBPAG

_MAPLE)

Scraper.py:

    # Import Modules Here:
import requests
import urllib.request
import time
from bs4 import BeautifulSoup

# Variable List:
url_spot_gram = (None)  # AG_GRAM_SPOT
AG_GRAM_SPOT = (None)

url_spot_ounce = (None)  # AG_OUNCE_SPOT
AG_OUNCE_SPOT = (None)

url_1 = (None)  # GLDAG_BRITANNIA
GLDAG_BRITANNIA = (None)

url_2 = (None)  # BBPAG_BRITANNIA
BBPAG_BRITANNIA = (None)

url_3 = (None)
GLDAG_PHILHARMONIC = (None)

url_4 = (None)
BBPAG_PHILHARMOIC = (None)

url_5 = (None)
GLDAG_MAPLE = (None)

url_6 = (None)
BBPAG_MAPLE = (None)

# Scraping Script Here:

def job():

    # Current Silver Spot Price: GRAM:
    global AG_GRAM_SPOT
    url_spot_gram = 'https://www.bullionbypost.co.uk/silver-price/silver-price-per-gram/'
    response = requests.get(url_spot_gram)
    soup = BeautifulSoup(response.text, 'html.parser')
    AG_GRAM_SPOT = soup.find('span', {'name': 'current_price_field'})

    # Current Silver Spot Price: OUNCE:
    global AG_OUNCE_SPOT
    url_spot_ounce = 'https://www.bullionbypost.co.uk/silver-price/week/ounces/GBP/'
    response = requests.get(url_spot_ounce)
    soup = BeautifulSoup(response.text, 'html.parser')
    AG_OUNCE_SPOT = soup.find('span', {'name': 'current_price_field'})

    # Script: GOLD.CO.UK | Silver Britannia
    global GLDAG_BRITANNIA
    url_1 = 'https://www.gold.co.uk/silver-coins/silver-britannia-coins/1oz-silver-britannia-dog-2018/'
    response = requests.get(url_1)
    soup = BeautifulSoup(response.text, 'html.parser')
    GLDAG_BRITANNIA = soup.find('td', {'id': 'total-price-inc-vat-1'})

    # Script: BULLIONBYPOST.CO.UK | Silver Britannia
    global BBPAG_BRITANNIA
    url_2 = 'https://www.bullionbypost.co.uk/silver-coins/britannia-silver-ounce/1oz-silver-britannia-best-value/'
    response = requests.get(url_2)
    soup = BeautifulSoup(response.text, 'html.parser')
    BBPAG_BRITANNIA = soup.find('td', {'id': 'price-inc-vat-per-unit-1'})

    # Script: GOLD.CO.UK | Silver Philharmonic
    global GLDAG_PHILHARMONIC
    url_3 = 'https://www.gold.co.uk/silver-coins/austrian-silver-philharmonic-coins/silver-philharmonic-2020/'
    response = requests.get(url_3)
    soup = BeautifulSoup(response.text, 'html.parser')
    GLDAG_PHILHARMONIC = soup.find('td', {'id': 'price-inc-vat-per-unit-1'})

    # Script: BULLIONBYPOST.CO.UK | Silver Philharmoic
    global BBPAG_PHILHARMOIC
    url_4 = 'https://www.bullionbypost.co.uk/silver-coins/austrian-philharmonic/2020-1oz-austrian-philharmonic-silver-coin/'
    response = requests.get(url_4)
    soup = BeautifulSoup(response.text, 'html.parser')
    BBPAG_PHILHARMOIC = soup.find('td', {'id': 'price-inc-vat-per-unit-1'})

    # Script: GOLD.CO.UK | Silver Maple
    global GLDAG_MAPLE
    url_5 = 'https://www.gold.co.uk/silver-coins/candian-silver-maple-coins/1oz-canadian-maple-silver-coin-2020/'
    response = requests.get(url_5)
    soup = BeautifulSoup(response.text, 'html.parser')
    GLDAG_MAPLE = soup.find('td', {'id': 'price-inc-vat-per-unit-1'})

    # Script: BULLIONBYPOST.CO.UK | Silver Maple
    global BBPAG_MAPLE
    url_6 = 'https://www.bullionbypost.co.uk/silver-coins/britannia-silver-ounce/1oz-silver-britannia-best-value/'
    response = requests.get(url_6)
    soup = BeautifulSoup(response.text, 'html.parser')
    BBPAG_MAPLE = soup.find('td', {'id': 'price-inc-vat-per-unit-1'})
    time.sleep(60)

    print(BBPAG_MAPLE)
    print(BBPAG_PHILHARMOIC)
    print(BBPAG_BRITANNIA)
    print(GLDAG_MAPLE)
    print(GLDAG_PHILHARMONIC)
    print(GLDAG_BRITANNIA)

while True:
    job()

您的页面在函数末尾呈现...我不知道有什么方法可以更新 Jinja 模板中 {{}} 内的值...它们已经呈现。

我的建议是使用 Ajax 并为值创建一个 REST Api。

  • 每种可能的产品在浏览器中每隔 x 秒通过 ajax;
  • 请求其价格
  • Flask 应用程序每 x 秒刷新一次所有可能物品的价格;
  • Flask 通过 API.
  • 提供所需的值

您可以通过http请求(单向通信)定期从前端获取后端

但是如果你想立即更新你可以使用 websockets(双向通信)你可以向前端发送消息而不需要定期请求。

但是 websockets 需要前端和后端的库(如果你不想从头开始构建它)。 Flask 有一些不错的 WebsocketLibraries,比如 Flask SocketIO.

如果您不需要立即响应,我建议您使用定期发送的 http 请求,直到您 运行 进入某些限制。