使用表单在 Flask 中执行 'advanced search' 的正确方法?

Correct way to use forms to do an 'advanced search' with Flask?

我正在尝试设置一些高级搜索,允许按 代码、国家/地区、标题 搜索产品。在我的 views.py 里面我有:

@app.route('/advanced_search_results/<code>/<country>/<title>', methods=['GET', 'POST'])
def advanced_search_results(code, country, title):
    products = models.Product.query.filter_by(code=code, country=country, title=title).all()
    return render_template('advanced_search_results.html', products=products)   


@app.route('/advanced_search', methods=['GET', 'POST'])
def advanced_search():
    form = AdvancedSearchForm()
    if form.validate_on_submit():
        code = form.code.data
        country = form.country.data
        title = form.title.data
        return redirect(url_for('advanced_search_results', code=code, country=country, title=title))
    return render_template('advanced_search.html', title='Advanced Search', form=form)

这里有一些明显的问题,但我最担心的是高级搜索将以 url 结束,例如 www.mysite.com/advanced_search_results/the_code/the_country/the_title,并且这个字符串只会随着搜索变得更高级而变得更长。我是在朝着正确的方向前进,还是错过了更好的处理方式?

您可以使用查询字符串 - 即您的 URL 看起来像:

mysite.com/advanced_search_results?country=USA&code=42&title=aTitle

from flask import request
@app.route('/advanced_search_results')
def adv_search_results():
    country = request.args.get('country')
    code = request.args.get('code')
    title = request.args.get('title')
    products = models.Product.query.filter_by(code=code, country=country, title=title).all()
    return render_template('advanced_search_results.html', products=products)

另请注意 unknown variables in url_for() will be appended as query parameters.