使用 Flask 时,在分页时记住参数的最佳方法是什么?
When using flask, what is the best way to remembering parameters while paginating?
假设我有一个包含多个过滤器的结果页面。过滤器作为 URL 参数传递给烧瓶。但是一旦我按下下一页,这就会被遗忘。在逐页浏览时保持这些参数的最佳方法是什么?
我确定 javascript 框架可以做到这一点,但我不想使用 javascript 框架。
假设您正在呈现 HTML 而不是 JSON(您似乎来自标签),为什么不直接将请求中的过滤器查询参数添加到呈现的页面中呢?
例如,像这样:
Python:
@app.route('/search')
def search():
page_no = request.args.get('page_no')
color = request.args.get('color')
brand = request.args.get('brand')
# TODO: Generate your results here..
return render_template('results.html', results=results, page_no=page_no, brand=brand color=color)
模板:
<a href="{{ url_for('search', page_no=str(page_no - 1), brand=brand, color=color) }}">Prev</a>
<a href="{{ url_for('search', page_no=str(page_no + 1), brand=brand, color=color) }}">Next</a>
这是一个最小的例子。您还需要处理特殊情况,例如不在第一页上呈现 "previous" link。可能还对输入参数进行了一些验证。但它演示了如何在 link URL.
中维护过滤器参数
根据你有多少过滤器参数,你也可以考虑像这样干燥它:
Python:
FILTER_PARAM_NAMES = ['keyword', 'date', 'foo', 'bar']
# ...
def search():
filter_params = {f: request.args.get(f) for f in FILTER_PARAM_NAMES}
# ...
return render_template('results.html', results=results, **filter_params)
模板:
url_for('search', page_no=page_no, **filter_params)
假设我有一个包含多个过滤器的结果页面。过滤器作为 URL 参数传递给烧瓶。但是一旦我按下下一页,这就会被遗忘。在逐页浏览时保持这些参数的最佳方法是什么?
我确定 javascript 框架可以做到这一点,但我不想使用 javascript 框架。
假设您正在呈现 HTML 而不是 JSON(您似乎来自标签),为什么不直接将请求中的过滤器查询参数添加到呈现的页面中呢?
例如,像这样:
Python:
@app.route('/search')
def search():
page_no = request.args.get('page_no')
color = request.args.get('color')
brand = request.args.get('brand')
# TODO: Generate your results here..
return render_template('results.html', results=results, page_no=page_no, brand=brand color=color)
模板:
<a href="{{ url_for('search', page_no=str(page_no - 1), brand=brand, color=color) }}">Prev</a>
<a href="{{ url_for('search', page_no=str(page_no + 1), brand=brand, color=color) }}">Next</a>
这是一个最小的例子。您还需要处理特殊情况,例如不在第一页上呈现 "previous" link。可能还对输入参数进行了一些验证。但它演示了如何在 link URL.
中维护过滤器参数根据你有多少过滤器参数,你也可以考虑像这样干燥它:
Python:
FILTER_PARAM_NAMES = ['keyword', 'date', 'foo', 'bar']
# ...
def search():
filter_params = {f: request.args.get(f) for f in FILTER_PARAM_NAMES}
# ...
return render_template('results.html', results=results, **filter_params)
模板:
url_for('search', page_no=page_no, **filter_params)