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

使用Flask-RESTful的reqparse时如何允许GET请求无请求体?

解决Flask-RESTful GET请求无请求体报错的问题

核心原因

问题出在reqparse.RequestParser的默认行为上:它会尝试解析所有请求的请求体,但GET请求按HTTP规范通常不携带请求体,当没有请求体时,解析逻辑会抛出错误,导致服务器返回无法理解请求的提示。

具体解决方法

1. 为GET方法单独配置Parser,仅解析URL参数

针对GET请求创建独立的Parser,明确指定解析位置为URL参数(location='args'),让它完全不处理请求体:

from flask_restful import Resource, reqparse

class SampleAPI(Resource):
    # POST请求Parser:处理JSON请求体参数
    post_parser = reqparse.RequestParser()
    post_parser.add_argument('post_param', type=str, required=True, location='json')

    # GET请求Parser:仅解析URL参数,不碰请求体
    get_parser = reqparse.RequestParser()
    get_parser.add_argument('get_param', type=str, required=True, location='args')

    def post(self):
        args = self.post_parser.parse_args()
        return {"post_param": args['post_param']}, 200

    def get(self):
        args = self.get_parser.parse_args()
        return {"get_param": args['get_param']}, 200

2. 全局统一配置Parser默认解析位置(可选)

如果项目中有多个GET请求需要处理,可以设置全局Parser默认解析URL参数,POST方法再单独指定解析JSON体:

# 全局默认解析URL参数
base_parser = reqparse.RequestParser(location='args')

class SampleAPI(Resource):
    get_parser = base_parser.copy()
    get_parser.add_argument('get_param', type=str, required=True)

    post_parser = reqparse.RequestParser(location='json')
    post_parser.add_argument('post_param', type=str, required=True)

    # 后续方法实现同上

3. 排查全局请求拦截规则

检查你的Flask应用/蓝图是否有全局拦截器强制要求所有请求带JSON体,如果有,需要针对GET请求跳过该检查:

from flask import request

@app.before_request
def check_json_requirement():
    # 仅对非GET请求校验JSON体
    if request.method != 'GET' and not request.is_json:
        return {"message": "Request must be JSON format"}, 400

验证方式

直接发送不带请求体的GET请求,比如GET /sample?get_param=demo,此时应该正常返回结果,不会再出现请求无法被理解的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:20:35