You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask中使用<>格式定义带查询参数的路由为何返回404错误?

为什么你的Flask路由写法会返回404?

嗨,这问题我刚学Flask的时候也踩过一模一样的坑!咱们一步步拆解清楚:

首先,你搞混了Flask里路径参数和查询字符串的处理逻辑——这是核心问题!

你原来的写法错在哪?

Flask的路由规则@app.route('/xxx')里的内容,只负责匹配URL的路径部分(也就是问号?之前的内容),问号和后面的term=whatever属于「查询字符串」,是Flask单独解析处理的,不属于路由匹配的范畴。

你写的@app.route('/search?term=<param>'),会让Flask把整个/search?term=<param>当作完整的路径来匹配——也就是说,只有当用户访问http://yourdomain/search?term=<param>(字面意义上的<param>字符)时才会触发这个路由,而你实际访问的是/search?term=whatever,自然完全匹配不上,返回404了。

正确的两种写法

根据你的需求,有两种可行的方案:

方案1:用查询字符串(也就是你提到的request.args)

这是处理?term=xxx这种场景的标准方式,路由只需要写基础路径,然后在函数里通过request.args获取参数:

from flask import Flask, request

app = Flask(__name__)

@app.route('/search')
def search_db():
    # 获取查询参数term,默认值设为None避免无参数时报错
    search_term = request.args.get('term')
    if not search_term:
        return "请提供搜索关键词哦"
    # 这里写你的数据库查询逻辑...
    return f"正在搜索:{search_term}"

现在访问/search?term=whatever就正常了,Flask会自动把查询字符串里的键值对解析到request.args这个类字典对象里。

方案2:用路径参数(如果想把关键词放在路径里)

如果你想改成/search/whatever这种形式的URL,才需要用<param>的写法:

@app.route('/search/<term>')
def search_db(term):
    # 直接接收路径里的term参数
    # 数据库查询逻辑...
    return f"正在搜索路径参数:{term}"

这时候访问/search/whatever就会触发这个路由,term参数会自动传递到函数里。

一句话总结

  • <param>是用来匹配URL路径中的变量的,比如/user/123里的123
  • request.args是用来获取查询字符串中的参数的,比如/user?id=123里的123

这下应该彻底明白为啥原来的写法无效了吧😉

内容的提问来源于stack exchange,提问作者NLS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:47:40