Flaja模板流与Jinja

时间:2015-01-13 15:46:45

标签: python flask jinja2

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

1 个答案:

答案 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流媒体选项)。

另见