首页 > 解决方案 > 使用 Python/Flask 对搜索结果进行分页

问题描述

我仍在研究我的项目,现在是搜索数据。通常我做一个发布请求做一个路由,将搜索字符串作为参数:

@bp.route('/search', methods=['GET', 'POST'])
def search():
    if request.method == 'POST':
        resp = db.session.query(MyTable).filter(MyTable.name.like('%'+request.form['search_name']+'%')).all()
        ... # do something else

我的问题是当搜索结果超过每页最大项目数时如何实现分页。

在没有任何用户操作的情况下显示数据时,分页本身不会成为问题,有几种方法可以使用 Flask-paginate 或通过 Flask-SQLAlchemy 的 paginate() 函数。但是如何通过其他页面传输搜索字符串,因为页面作为 GET 参数给出?page=x并且搜索字符串是 POST 参数?

不知怎的,我脑子里跑了出来,在网上做了很多调查,但我只得到了对正常数据进行分页的结果,而不是搜索结果。

能以某种方式给我一个建议吗?

非常感谢,问候,托马斯

标签: pythonsearchflaskpagination

解决方案


我想我有一个解决方案 - Flask的会话类:

@app.route('/search', methods=['GET', 'POST'])
def search():
    if 'name' in session['search']:
        name = session['search']['name']
    elif request.method == 'POST':
         jboss_name = request.form.get('name')
         session['search']['name'] = name

    page = request.args.get('page', 1, type=int)

    resp = db.session.query(MyTable)\
            .filter(MyTable.name.like('%' + name + '%'))\
            .paginate(page, app.config['ITEMS_PER_PAGE'], False)

    next_url = url_for('search', page=resp.next_num) \
        if resp.has_next else None
    prev_url = url_for('search', page=resp.prev_num) \
        if resp.has_prev else None

    return render_template('search.html',
                            resp=resp,
                            next_url=next_url,
                            prev_url=prev_url)

第一次调用是通过 POST 请求完成的,将数据发送到相应的 app.route。如果还没有设置 session 值,则在第 5 行设置。通过 session 可以确保原始搜索字符串通过所有页面。

这可能不是高度发达的,但至少是一个关于如何对搜索结果进行分页的工作示例。在这个简短的片段中未实现的是清除会话。

问候,托马斯


推荐阅读