使用 Python (Flask/Postgresql) 的 DataTables 服务器端处理
DataTables server-side processing using Python (Flask/Postgresql)
首先,这是我正在使用的:Python 3,Flask,PostgreSQL,bootstrap 主题。
我想做什么?
我有一个 table 值接近 34000。问题是,页面加载速度非常慢,原因是值的数量。如何通过 Python 和 Flask 使用服务器端处理(或其他)来提高性能?
代码:
这是我的一部分 main.py :
@login_required
def home():
connect() # Connect to the PG database
connect.cur.execute("""SELECT * FROM test""")
test_execute = connect.cur.fetchall()
count_equipement()
return render_template('index.html',
value=test_execute,
value2=count_equipement.nb_equipement,
value3=check_ok.nb_ok,
value4=check_ko.nb_ko)
test_execute 获取我的 table 的所有值。在我的 index.html 中,我是这样显示数据的:
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th>First</th>
<th>Second</th>
<th>Third</th>
<th>Fourth</th>
<th>Fifth</th>
</tr>
</thead>
<tfoot>
<tr>
<th>First</th>
<th>Second</th>
<th>Third</th>
<th>Fourth</th>
<th>Fifth</th>
</tr>
</tfoot>
<tbody>
{% for row in value %}
<tr>
<td>{{row[0]}}</td>
<td><a href="{{ url_for('site', site_id=row[1]) }}">{{row[1]}}</a></td>
<td>{{row[2]}}</td>
<td>{{row[3]}}</td>
<td>{{row[4]}}</td>
</tr>
{% endfor %}
</tbody>
</table>
在我的 bootstrap 主题中,有一个 .js 可以正确分页 table。这是具有 8 个值的结果:
我该如何做服务器端处理?我已经检查过 this link 但我不认为我可以在我的情况下应用它...
这是我的问题的答案。 (评论是法语)
@app.route('/stack', )
@app.route('/stack/<int:page>', defaults={'page': 1})
@login_required
def stack(page):
"""
retourne la page 1 par défaut, puis change selon le numéro /4 par ex
"""
connect()
connect.cur.execute("""SELECT COUNT(*) FROM mydatabase""")
count = connect.cur.fetchall()
count = count[0][0]
check.count()
PER_PAGE = 10
offset = ((int(page)-1) * PER_PAGE)
connect.cur.execute("""SELECT *
FROM mydatabase
ORDER BY table1 OFFSET %s LIMIT %s""" % (offset, PER_PAGE))
solutions = connect.cur.fetchall()
# Display a 409 not found page for an out of bounds request
if not solutions and page != 1:
return(render_template('404.html', errmsg="Requested page out of bounds"), 404)
pagination = Pagination(page, PER_PAGE, count)
return(render_template('index.html',
r=request,
value=solutions,
pagination=pagination))
def url_for_other_page(page):
"""
récupère l'url
"""
args = request.view_args.copy()
args['page'] = page
return url_for(request.endpoint, **args)
app.jinja_env.globals['url_for_other_page'] = url_for_other_page
首先,这是我正在使用的:Python 3,Flask,PostgreSQL,bootstrap 主题。
我想做什么?
我有一个 table 值接近 34000。问题是,页面加载速度非常慢,原因是值的数量。如何通过 Python 和 Flask 使用服务器端处理(或其他)来提高性能?
代码:
这是我的一部分 main.py :
@login_required
def home():
connect() # Connect to the PG database
connect.cur.execute("""SELECT * FROM test""")
test_execute = connect.cur.fetchall()
count_equipement()
return render_template('index.html',
value=test_execute,
value2=count_equipement.nb_equipement,
value3=check_ok.nb_ok,
value4=check_ko.nb_ko)
test_execute 获取我的 table 的所有值。在我的 index.html 中,我是这样显示数据的:
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th>First</th>
<th>Second</th>
<th>Third</th>
<th>Fourth</th>
<th>Fifth</th>
</tr>
</thead>
<tfoot>
<tr>
<th>First</th>
<th>Second</th>
<th>Third</th>
<th>Fourth</th>
<th>Fifth</th>
</tr>
</tfoot>
<tbody>
{% for row in value %}
<tr>
<td>{{row[0]}}</td>
<td><a href="{{ url_for('site', site_id=row[1]) }}">{{row[1]}}</a></td>
<td>{{row[2]}}</td>
<td>{{row[3]}}</td>
<td>{{row[4]}}</td>
</tr>
{% endfor %}
</tbody>
</table>
在我的 bootstrap 主题中,有一个 .js 可以正确分页 table。这是具有 8 个值的结果:
我该如何做服务器端处理?我已经检查过 this link 但我不认为我可以在我的情况下应用它...
这是我的问题的答案。 (评论是法语)
@app.route('/stack', )
@app.route('/stack/<int:page>', defaults={'page': 1})
@login_required
def stack(page):
"""
retourne la page 1 par défaut, puis change selon le numéro /4 par ex
"""
connect()
connect.cur.execute("""SELECT COUNT(*) FROM mydatabase""")
count = connect.cur.fetchall()
count = count[0][0]
check.count()
PER_PAGE = 10
offset = ((int(page)-1) * PER_PAGE)
connect.cur.execute("""SELECT *
FROM mydatabase
ORDER BY table1 OFFSET %s LIMIT %s""" % (offset, PER_PAGE))
solutions = connect.cur.fetchall()
# Display a 409 not found page for an out of bounds request
if not solutions and page != 1:
return(render_template('404.html', errmsg="Requested page out of bounds"), 404)
pagination = Pagination(page, PER_PAGE, count)
return(render_template('index.html',
r=request,
value=solutions,
pagination=pagination))
def url_for_other_page(page):
"""
récupère l'url
"""
args = request.view_args.copy()
args['page'] = page
return url_for(request.endpoint, **args)
app.jinja_env.globals['url_for_other_page'] = url_for_other_page