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

Flask框架中类方法内获取request.form始终为空的问题

解决Flask类中request.form获取为空的问题

你碰到的这个request.form返回空的情况,我帮你梳理几个常见原因和对应的解决方案:

1. 路由参数名不匹配(代码里的明显错误)

你定义的路由是/create/<id>,但对应的处理方法参数写的是def create(self, od): —— Flask会把URL里的<id>值传递给方法中同名的参数,这里参数名od和id不匹配,不仅会导致你拿不到URL里的id值,甚至可能干扰请求上下文的正常处理。先把参数名改一致:

def create(self, id):  # 把od改成id,和路由里的<id>对应
    root = request.form.get('root')
    # 后续业务逻辑...

2. 请求的Content-Type不匹配

request.form只处理表单编码的请求(Content-Type为application/x-www-form-urlencoded或multipart/form-data)。如果你的请求是用JSON格式发送的(Content-Type: application/json),那request.form自然是空的,这时候应该用request.get_json()来获取数据:

def create(self, id):
    # 兼容表单和JSON两种请求格式
    if request.is_json:
        data = request.get_json()
        root = data.get('root')
    else:
        root = request.form.get('root')
    # 后续业务逻辑...

3. 确认Flask应用是否正确启动

你的类里没有看到启动应用的方法,需要添加一个run方法来启动Flask服务,否则请求根本无法到达处理函数:

class MyAPIClass(object):
    def __init__(self, address="0.0.0.0", port=5000):
        self.address = address
        self.port = port
        self.app = Flask(__name__)
        self.logger = self.app.logger
        self.app.add_url_rule('/create/<id>', 'create', self.create, methods=['POST'])
    
    def create(self, id):
        root = request.form.get('root')
        return f"获取到的root值: {root}"
    
    def run(self):
        # debug模式方便开发时调试,上线前记得关闭
        self.app.run(host=self.address, port=self.port, debug=True)

# 启动应用入口
if __name__ == "__main__":
    api_service = MyAPIClass()
    api_service.run()

4. 验证请求发送方式

确保你发送POST请求时,确实是按照表单格式传递参数的:

  • 用Postman的话,选择form-data或x-www-form-urlencoded标签,添加root参数和对应值
  • 用curl命令测试的话:
curl -X POST -F "root=测试值" http://localhost:5000/create/123

按照上面的步骤排查,应该就能解决request.form为空的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:26:23