【发布时间】:2020-08-06 20:13:33
【问题描述】:
我有一个项目,我在 sqlite3 数据库中保存了大量数据。我想在 Flask 中创建一个简单的应用程序 - 显示来自数据库的适当数据。
每隔几分钟就会将新记录添加到数据库中 - 我希望此应用程序自动刷新。我准备了一些关于它的信息,发现可以使用socketioCan flask framework send real-time data from server to client browser? 或AJAX 以某种方式完成它。我试图做这样的事情:或Python Flask date update real-time,但我没能做到。
这是我现在使用的代码:
from flask import Flask, request, render_template, session, redirect
import numpy as np
import pandas as pd
import sqlite3
con = sqlite3.connect(r'path')
app = Flask(__name__)
df = pd.read_sql('select * from table1', con)
df1 = pd.read_sql('select * from table2', con)
@app.route('/', methods=("POST", "GET"))
def html_table():
return render_template('app.html',
tables=[df.to_html(classes='data1'),df1.to_html(classes='data2')],
titles=df.columns.values)
if __name__ == '__main__':
app.run()
模板:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Title</title>
</head>
<body>
{% for table in tables %}
{{titles[loop.index]}}
{{ table|safe }}
{% endfor %}
</body>
</html>
在这种情况下,所有内容都会显示,但不能实时工作。
我在问一些关于如何做的说明或建议?我可以以某种方式使用我在这里发布的链接吗?这是我在 Flask 中的第一个应用程序,所以我不太清楚如何实现。
【问题讨论】:
-
我不确定你所说的“实时”是什么意思,但你不能让所有的调用异步吗?由于网络连接,数据库调用速度非常慢;你有 sqlite,所以它是不同的,但如果你希望应用程序是 responsive(我假设你的意思是实时),那么你应该使用this async await paradigm。
-
@MikeWilliamson 我希望数据库中的这些选择在应用程序中异步显示 - 如果数据库中只出现一些新记录,它将在不重新加载整个应用程序的情况下显示 - 目前,新记录是在我重新运行整个应用程序之前不会显示。
-
然后你需要让你的动作“一口大小”,并以某种方式缓存差异。现在你有
pd.read_sql,它可以一次抓取整个查询。那没问题;它在路线之外。但是您的路线中也有df.to_html。这意味着每次点击页面时都需要调用它。您应该在路由之外执行所有to_html,然后可能对缓存进行一些巧妙的比较,以查看它何时更改。这可能会有所帮助。