Angular调用Flask POST API出现405不允许错误求助
解决Angular调用Flask POST API出现405 Not Allowed的问题
你遇到的405错误主要来自两个常见的核心问题:URL路径不匹配和跨域资源共享(CORS)未配置,咱们一步步来排查解决:
1. 修正URL路径匹配问题
你Angular代码里的请求URL是:
this.httpClient.post('http://127.0.0.1:5000/controllers/update/', ...)
注意末尾多了一个斜杠/,而Flask里注册的路由是:
api.add_resource(CtrlUpdate, '/controllers/update')
Flask-RESTful的路由默认是严格匹配规则,这两个路径会被视为完全不同的地址。当你请求带斜杠的URL时,Flask会返回301重定向到不带斜杠的版本,但POST请求经过重定向后会自动转为GET请求,而你的CtrlUpdate类只实现了post方法,自然就会返回405 Not Allowed。
解决办法:
要么统一Angular的请求URL,去掉末尾斜杠:
this.httpClient.post('http://127.0.0.1:5000/controllers/update', ...)
要么在Flask中同时注册带斜杠和不带斜杠的路由,兼容两种请求:
api.add_resource(CtrlUpdate, '/controllers/update/', '/controllers/update')
2. 配置CORS解决跨域问题
Angular通常运行在http://localhost:4200,而Flask服务在http://127.0.0.1:5000,属于不同的源,浏览器会默认拦截跨域请求,这也可能表现为405错误或者请求被直接阻断。
解决步骤:
- 先安装Flask-CORS扩展:
pip install flask-cors
- 在你的Flask代码中全局启用CORS:
from flask import Flask, jsonify from flask_restful import Api, Resource from flask_cors import CORS app = Flask(__name__) CORS(app) # 允许所有源的跨域请求,生产环境可限制特定域名 api = Api(app) class CtrlUpdate(Resource): """Update.""" def post(self): """Controller update.""" # 后续可添加获取请求数据的逻辑 return jsonify({'status': True}) api.add_resource(CtrlUpdate, '/controllers/update') if __name__ == '__main__': app.run(debug=True)
3. 可选:确保Flask正确接收POST数据
当上面两个问题解决后,你可能需要在Flask的post方法里正确获取Angular发送的JSON数据,记得导入request对象:
from flask import request # 在CtrlUpdate的post方法中: def post(self): data = request.get_json() if not data: return jsonify({'status': False, 'message': '未接收到有效数据'}), 400 # 提取需要的参数 ctrl_id = data.get('ctrl_id') port = data.get('port') # 编写你的更新逻辑 return jsonify({'status': True})
按照上面的步骤调整后,应该就能正常调用POST API了。
内容的提问来源于stack exchange,提问作者rajvi
相关产品推荐
相关产品推荐

