我正在开发一个简单的Flask Web应用程序,该应用程序在Bootstrap表中显示来自PSQL数据库的数据(2000多个项目)。问题是显示表的页面需要很长时间才能加载。
我的models.py
:
from app import db
class Movie(db.Model):
__tablename__ = 'movies'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(60), index=True, unique=True)
director = db.Column(db.String(60), index=True)
release_date = db.Column(db.Date, index=True)
duration = db.Column(db.Integer)
def __repr__(self):
return '<Movie: %s>' %(self.name)
我的views.py
:
@home.route('/')
movies = Movie.query.all()
return render_template('home/index.html', movies=movies)
数据在index.html
:
{% for movie in movies %}
<tr>
<td> {{ movie.id }} </td>
<td> {{ movie.name }} </td
<td> {{ movie.director }} </td>
<td> {{ movie.release_date }} </td>
<td> {{ movie.duration }} </td>
</tr>
{% endfor %}
我为我的桌子使用分页,虽然只是在视觉上(数据仍然完全在开头加载)。要实现此目的,请使用Bootstrap-Table,以便我的表格看起来像this。
在我看来,最好的选择是首先加载15个项目并显示它们。一旦加载了其他所有内容,就可以加载剩余的项目。但是,我不知道该怎么做。
如何改善表格页面加载时间?
答案 0 :(得分:1)
你应该paginate。您可以使用AJAX请求获得更多结果,而无需重新加载页面。您可以对任何查询进行分页,以避免一次加载所有项目。相反,它一次只能加载你想要的数量。
考虑以下视图和模板,演示如何使用paginate对象。
@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
@app.route('/index/<int:page>', methods=['GET', 'POST'])
@login_required
def index(page=1):
form = PostForm()
if form.validate_on_submit():
post = Post(body=form.post.data, timestamp=datetime.utcnow(), author=g.user)
db.session.add(post)
db.session.commit()
flash('Your post is now live!')
return redirect(url_for('index'))
posts = g.user.followed_posts().paginate(page, POSTS_PER_PAGE, False).items
return render_template('index.html',
title='Home',
form=form,
posts=posts)
然后是模板
<!-- posts is a Paginate object -->
{% for post in posts.items %}
<p>
{{ post.author.nickname }} says: <b>{{ post.body }}</b>
</p>
{% endfor %}
{% if posts.has_prev %}<a href="{{ url_for('index', page=posts.prev_num) }}"><< Newer posts</a>{% else %}<< Newer posts{% endif %} |
{% if posts.has_next %}<a href="{{ url_for('index', page=posts.next_num) }}">Older posts >></a>{% else %}Older posts >>{% endif %}
生成这样的页面,只等待3个结果,即使查询有一百万个可能的结果。
中看到此代码更多解释