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

Flask-RESTful处理带?的URL查询参数失效,求解决方法

问题分析与解决方案

你的核心问题是错误地将URL查询参数(?之后的部分)当作路由规则的一部分。Flask(包括Flask-RESTful)的路由系统只匹配URL的路径部分,查询参数属于请求的附加参数,不属于路由定义的范畴。因此当你访问/api/customers?sort=id&sort_type=desc时,请求会匹配到/api/customers对应的Get资源,执行未排序逻辑,而非GetSorted的排序逻辑。

正确实现方式

方案:合并资源逻辑,通过request.args获取查询参数

将两种请求逻辑合并到同一个Resource中,通过request.args读取URL查询参数,判断是否需要执行排序:

from flask_restful import Resource, request

fields_list = ['id']

db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)

class GetUsers(Resource):
    @staticmethod
    def get():
        # 从查询参数中获取排序字段和类型,sort_type默认设为asc
        sort_field = request.args.get('sort')
        sort_type = request.args.get('sort_type', 'asc')

        if sort_field:
            # 验证参数合法性
            if sort_field not in fields_list or sort_type not in ['asc', 'desc']:
                return {'Error': 'Wrong field or sort type'}, 400
            
            # 安全构建排序表达式,避免SQL注入
            if sort_type == 'asc':
                order_expr = getattr(User, sort_field).asc()
            else:
                order_expr = getattr(User, sort_field).desc()
            
            users = User.query.order_by(order_expr).all()
        else:
            # 无查询参数时返回所有用户
            users = User.query.all()
        
        usr_list = Collection.user_to_json(users)
        return {"Users": usr_list}, 200

# 注册唯一路由
api.add_resource(GetUsers, '/api/customers')

关键细节说明

  1. 获取查询参数:使用request.args.get()可安全读取URL查询参数,还能设置默认值(比如sort_type默认用asc)。
  2. 避免SQL注入:不要直接用f-string拼接SQL语句,改用SQLAlchemy的order_by结合模型属性的方式,从根源避免注入风险。
  3. 路由简化:只需注册/api/customers一个路由,所有访问该路径的请求(无论是否带查询参数)都会进入GetUsers的get方法处理。

测试验证

访问http://127.0.0.1:5000/api/customers?sort=id&sort_type=desc时,会触发排序逻辑,返回按id降序排列的用户列表;直接访问/api/customers则返回未排序的全量用户。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:31:09