Flask的URL结构和表单提交
在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)
等等。