Python Flask SQLAlchemy 分页
Posted
技术标签:
【中文标题】Python Flask SQLAlchemy 分页【英文标题】:Python Flask SQLAlchemy Pagination 【发布时间】:2017-08-23 12:51:31 【问题描述】:我在使用 Flask-SQLAlchemy 或 Flask-Pagination 实现分页时遇到问题。我不确定如何初始化分页、设置页面、确定页面、offest 等。我来自 php,对 Python 还很陌生。
我正在查询我数据库中的所有帖子
posts = Posts.query.order_by(Posts.time.desc()).all()
我一直在查看以下示例:
http://www.ergo.io/tutorials/better-pagination-in-flask/better-pagination-in-flask/ https://pythonhosted.org/Flask-paginate/ sqlalchemy pagination我真的不知道该怎么做,我发现的信息在文章之间有很大差异。这让我感到困惑,不知道从哪里开始。我想查询数据库表的所有行,将结果限制为 20 并分页。我没看清楚。
【问题讨论】:
【参考方案1】:我推荐使用 Flask-SQLAlchemy 的分页:http://flask-sqlalchemy.pocoo.org/2.1/api/?highlight=pagination#flask.ext.sqlalchemy.Pagination
这里有一个写得很好的例子:https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-ix-pagination
这是视图的基本思想:
@app.route('/myview/<int:page>',methods=['GET'])
def view(page=1):
per_page = 10
posts = Posts.query.order_by(Posts.time.desc()).paginate(page,per_page,error_out=False)
return render_template('view.html',posts=posts)
然后是模板(我不知道你的帖子模型,所以我做了一些东西):
<html>
<head>
Posts
</head>
<body>
% for post in posts.items %
<p>
post.post_name post body: <b> post.body </b>
</p>
% endfor %
% if posts.has_prev %<a href=" url_for('view', page=posts.prev_num) "><< Newer posts</a>% else %<< Newer posts% endif % |
% if posts.has_next %<a href=" url_for('view', page=posts.next_num) ">Older posts >></a>% else %Older posts >>% endif %
</body>
</html>
【讨论】:
需要小改动 - @app.route('/myview/', methods=['GET'], defaults="page": 1) @app.route('/myview/if
块。例如,if args.sort_order == 'desc': # do something here
,你就明白了。【参考方案2】:
控制器
@app.route('/', methods=['GET'], defaults="page": 1)
@app.route('/<int:page>', methods=['GET'])
def index(page):
page = page
per_page = 2
users = User.query.paginate(page,per_page,error_out=False)
# print("Result......", users)
return render_template("index.html", users=users)
在视图中
% for user in users.items %
<h1> user.name </h1>
% endfor %
<nav aria-label="Page navigation example">
<ul class="pagination">
% if users.has_prev %
<li class="page-item"> <a class="page-link" href=" url_for('index', page=users.prev_num) ">Previous</a></li>
% else %
<li class="page-item"><a class="page-link btn disabled" href="#">Previous</a></li>
% endif %
% if users.has_next %
<li class="page-item"> <a class="page-link" href=" url_for('index', page=users.next_num) ">Next</a></li>
% else %
<li class="page-item"><a class="page-link btn disabled" href="#">Next</a></li>
% endif %
</ul>
</nav>
【讨论】:
【参考方案3】:这是在烧瓶中添加分页的最简单答案
no_of_posts = 3
page = request.args.get("number")
if page is None:
page = 1
else:
page = int(page)
allPosts = Posts.query.filter_by().all()
length = len(allPosts)
allPosts = allPosts[(page-1)*no_of_posts: page*no_of_posts]
if page > 1:
prev = page -1
else:
prev = None
if page < math.ceil(length/no_of_posts):
next = page + 1
else:
next = None
在模板中
% if prev %
<a href="?number= prev ">« Previous</a>
% endif %
% if next %
<a href="?number= next ">Next »</a>
% endif %
【讨论】:
虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。以上是关于Python Flask SQLAlchemy 分页的主要内容,如果未能解决你的问题,请参考以下文章
Flask 学习-73.Flask-SQLAlchemy 分页查询paginate