jinja2模板需要10秒才能渲染,如何优化?

时间:2015-05-15 12:27:42

标签: flask jinja2

在我的烧瓶网络应用程序中,有一条路线显示所有成员的名字以' A,B,C等开头。'或显示所有已注册成员的全部显示按钮。现在它总计大约750个用户。问题是显示'显示全部'列表需要10秒以上。对DB本身的请求很快,它是需要所有这些秒的渲染。我想知道是否有办法加快这个速度?我对python,flask和jinja2很陌生,所以我还不知道优化路径。

这是views.py,当我点击'显示全部"在网页上的按钮,它调用url,字母参数设置为' 0':

@main.route('/all-members')
@login_required
@admin_required
def all_members():
    alphabet = list(string.ascii_lowercase)
    first_letter = request.args.get('letter')
    if first_letter == '0':
        user_ = User.query.order_by(User.fullname.asc()).all()
    else:
        user_ = User.query.filter(User.username.startswith(first_letter)).order_by(User.fullname.asc()).all()
    return render_template('all_members.html', all_members = user_, alphabet = alphabet)

它返回750个用户对象。然后我将结果传递给模板:

    return render_template('all_members.html', all_members = user_, alphabet = alphabet)

模板:

{% extends "base.html" %}

{% block title %}Zata - members list{% endblock %}

{% block page_content %}
<div class="page-header" xmlns="http://www.w3.org/1999/html">
    <h1>Tribe members list</h1>
<p></p>
{% for letter in alphabet %}
 <a class="btn btn-success" href="{{ url_for('.all_members', letter = letter) }}">{{ letter }}</a>
{% endfor %}
<a class="btn btn-info" href="{{ url_for('.all_members', letter = 0) }}">Show All</a>
</div>
{% for member in all_members %}

    <div class="row">
<p>
        <div class="col-md-2">
            <a href="{{ url_for('main.member',username=member.username) }}">{{ member.fullname }}</a>
        </div>
        <div class="col-md-1">
            <a class="btn btn-warning btn-xs" href="{{ url_for('.edit_profile_admin', id=member.id) }}"> Edit Profile</a>
        </div>
        <div class="col-md-3">
            <a class="btn btn-info btn-xs" href="{{ url_for('.add_punchcard', id=member.id, next=request.url) }}"> Manage Punchcard</a>
            {% if member.punchcard_gold %}<span class="btn btn-xs"  style="background-color:gold">G:{{ member.punchcard_gold }}</span>{% endif %}
            {% if member.punchcard_normal %}<span class="btn btn-xs"  style="background-color:#c0c0c0">R:{{ member.punchcard_normal }}</span>{% endif %}
        </div>
        <div class="col-md-4">
            <a class="btn btn-info btn-xs" href="{{ url_for('.add_seasonpass', id=member.id, next=request.url) }}"> Manage Season pass</a>
            {% if member.season_pass_gold %}<span class="btn btn-xs"  style="background-color:gold">G:{{ member.season_pass_gold }}</span>{% endif %}
            {% if member.season_pass_normal %}<span class="btn btn-xs"  style="background-color:#c0c0c0">R:{{ member.season_pass_normal }}</span>{% endif %}
        </div>
        <div class="col-md-2">
             <span class="btn btn-xs"  style="background-color:yellowgreen">Class attended: {{ member.class_attended|length }}
        </div>
    </p>
    </div>



{% endfor %}

{% endblock %}

慢的部分显然是{all_members%}中的成员%,但是有另一种方法来浏览用户列表并构建页面吗?

1 个答案:

答案 0 :(得分:4)

问题不在于您的Jinja模板,而在于您的Python代码。您将同时返回所有记录,这会降低执行速度。你需要执行某种分页/延迟加载。如果您正在使用Flask-SQLAlchemy,那么它有一个paginate方法,可以为您完成所有工作。例如,您的查询将类似于此

user_ = User.query.order_by(User.fullname.asc()).paginate(1, 10, True)

您可以找到更多信息here