python - 使用 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 参数?
不知怎的,我脑子里跑了出来,在网上做了很多调查,但我只得到了对正常数据进行分页的结果,而不是搜索结果。
能以某种方式给我一个建议吗?
非常感谢,问候,托马斯
解决方案
我想我有一个解决方案 - 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 可以确保原始搜索字符串通过所有页面。
这可能不是高度发达的,但至少是一个关于如何对搜索结果进行分页的工作示例。在这个简短的片段中未实现的是清除会话。
问候,托马斯
推荐阅读
- jboss - (Keycloak) Freemarker 模板系统属性和环境变量
- memory-management - 使用原始指针的推力函数:控制内存分配
- flutter - 如何从 Flutter 中的另一个文件调用小部件部分
- c# - 如何编辑组合框以及从列表中选择项目
- reactjs - 数据变化时如何在ReactJS中刷新Material-Table(Material-ui)组件
- ssl - 两个 SSL 应用程序 - WebAPI 不运行
- python - 如何在 python 中运行 CGI 脚本
- c# - Azure 表客户端中的插入操作何时返回除 204 之外的其他内容?
- android - 相机新捕获图像的路径总是返回空
- python-3.x - 无法更新到 Spyder 4.0.0