Flask+SQLAlchemy搜索功能报错:redirect()参数错误求助
解决Flask中redirect()的TypeError问题:意外的keyword argument 'query'
嘿,这个问题我之前踩过坑!错误提示已经把问题点得明明白白——你在调用Flask的redirect()函数时,传了它根本不认识的query关键字参数,这就是触发错误的直接原因。
为什么会出错?
Flask的redirect()函数设计很简单:它只接受目标URL字符串或者一个响应对象作为参数,并不支持直接通过query=xxx这种方式附加查询参数。你肯定是想把搜索关键词传递到下一个页面,但用错了方法。
正确的修改方式
你需要先生成一个带查询参数的完整URL,再把这个URL传给redirect()。这里有两种可靠的做法:
方法1:用url_for()生成路由URL(推荐)
url_for()是Flask提供的安全生成路由URL的工具,它会自动处理URL编码,还能帮你避免硬编码路径的问题。假设你的搜索结果展示路由叫show_results,代码应该改成这样:
from flask import url_for, redirect, request # 处理搜索表单提交的路由 @app.route('/submit-search', methods=['POST']) def submit_search(): mrn_query = request.form.get('mrn') # 从表单获取用户输入的MRN # 生成带查询参数的结果页面URL,再重定向过去 return redirect(url_for('show_results', query=mrn_query)) # 展示搜索结果的路由 @app.route('/results') def show_results(): search_query = request.args.get('query') if search_query: # 执行带MRN条件的查询 results = Patient.query.filter(Patient.mrn == search_query).all() else: # 没有查询参数时展示全量数据 results = Patient.query.all() return render_template('results.html', results=results)
方法2:直接构造URL字符串
如果不想用url_for(),也可以手动拼接URL,但要注意处理特殊字符的编码(不过url_for()会自动帮你做这件事,所以更推荐第一种):
return redirect(f'/results?query={mrn_query}')
额外的优化建议
为了避免用户刷新页面时重复提交表单,建议遵循PRG模式(Post/Redirect/Get):
- 表单用
POST方法提交到处理路由 - 处理完成后重定向到
GET路由展示结果 - 在结果路由中通过
request.args.get()获取查询参数
另外,检查你的前端表单代码,确保action属性指向正确的处理路由,比如:
<form method="POST" action="{{ url_for('submit_search') }}"> <input type="text" name="mrn" placeholder="输入MRN编号"> <button type="submit">搜索</button> </form>
这样修改后,点击搜索按钮就不会再触发TypeError,而且能正确传递搜索参数并展示匹配结果啦!
内容的提问来源于stack exchange,提问作者tomjjoy123
相关产品推荐
相关产品推荐

