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
相关产品推荐
相关产品推荐

