gpt4 book ai didi

python - 使用 Jinja 流式传输 Flask 模板

转载 作者:太空宇宙 更新时间:2023-11-03 11:28:46 25 4
gpt4 key购买 nike

我有一个 flask 应用程序。在特定 View 中,我显示了一个总共有大约 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() 部分工作并更新了代码。

最佳答案

这两种情况下的问题几乎可以肯定是您正在构建 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 流选项)。

另见

关于python - 使用 Jinja 流式传输 Flask 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27925969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com