我有一个烧瓶应用程序。在特定的视图中,我显示了一个总共约有10万行的表。可以理解的是,需要花费很长时间来加载页面,我正在寻找改进它的方法。到目前为止,我已经确定我查询数据库并相当快地得到结果。我认为问题在于渲染实际页面。我找到this page on streaming并且正在努力解决这个问题,但一直遇到问题。我已尝试使用此代码提供的stream_template解决方案:
@app.route('/thing/matches', methods = ['GET', 'POST'])
@roles_accepted('admin', 'team')
def r_matches():
matches = Match.query.filter(
Match.name == g.name).order_by(Match.name).all()
return Response(stream_template('/retailer/matches.html',
dashboard_title = g.name,
match_show_option = True,
match_form = form,
matches = matches))
def stream_template(template_name, **context):
app.update_template_context(context)
t = app.jinja_env.get_template(template_name)
rv = t.stream(context)
rv.enable_buffering(5)
return rv
匹配查询是返回100k +项目的查询。但是,每当我运行此页面时,页面只显示空白,没有任何内容。我也尝试过将数据流式传输到json并通过ajax加载它的解决方案,但json文件中似乎也没有任何东西!以下是该解决方案的样子:
@app.route('/large.json')
def generate_large_json():
def generate():
app.logger.info("Generating JSON")
matches = Product.query.join(Category).filter(
Product.retailer == g.retailer,
Product.match != None).order_by(Product.name)
for match in matches:
yield json.dumps(match)
app.logger.info("Sending file response")
return Response(stream_with_context(generate()))
我看到的另一个解决方案是分页。这个解决方案运行良好,除了我需要能够按标题对整个数据集进行排序,并且无法在不使用表格中的整个数据集然后使用JQuery进行排序/分页的情况下找到方法。
通过转到/large.json获取的文件始终为空。请帮助或推荐另一种方式来显示如此大的数据集!
编辑:我让generate()部分工作并更新了代码。
答案 0 :(得分:2)
这两种情况下的问题几乎可以肯定,你正在构建100K + Match
项并将它们存储在内存中。您还希望使用yield_per
从数据库中流式传输结果。但是,只有PostGres + psycopg2支持必要的stream_result
参数(here's a way to do it with MySQL):
matches = Match.query.filter(
Match.name == g.name).order_by(Match.name).yield_per(10)
# Stream ten results at a time
如果您使用的是Flask-SQLAlchemy,则可以使用其Pagination
class对查询服务器端进行分页,而不是将所有100K +条目加载到浏览器中。这样做的另一个好处是不需要浏览器管理所有DOM条目(假设您正在使用HTML流媒体选项)。