Flask的URL结构和表单提交

6 投票
1 回答
3686 浏览
提问于 2025-04-17 09:34

在Flask中,你需要在方法声明上方写出路由,像这样:

@app.route('/search/<location>/')
def search():
  return render_template('search.html')

但是在HTML中,表单会以这种方式提交到网址:

www.myapp.com/search?location=paris

这样提交似乎会从应用程序返回一个404错误,而

www.myapp.com/search/london

则会按预期返回结果。

我相信这里有个简单的地方我没有理解,但路由引擎应该会考虑查询字符串参数来满足规则要求。

如果不是的话,对于这种情况,最好的解决方案是什么?我相信90%的开发者都会遇到这个问题。

1 个回答

10

查询参数并不是路由匹配的一部分,也不会被直接放入函数的参数中。只有匹配到的URL部分会被放入。你需要使用的是 request.args(用于获取GET请求的查询参数)、request.form(用于获取POST请求的参数)或者 request.values(用于获取两者的参数)。

如果你想同时支持这两种请求,可以这样做:

@app.route('/search/<location>')
def search(location=None):
    location = location or request.args.get('location')
    # perform search

不过,如果你想要根据其他参数进行搜索,最好的方法可能是更接近于:

def _search(location=None,other_param=None):
    # perform search

@app.route('/search')
def search_custom():
    location = request.args.get('location')
    # ... get other params too ...
    return _search(location=location, other params ... )

@app.route('/search/<location>')
def search_location(location):
    return _search(location=location)

等等。

撰写回答