在基于 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 请求,直到您 运行 进入某些限制。
目前正在构建一个 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 请求,直到您 运行 进入某些限制。