我的应用程序运行良好,然后我开始重新设计我的redis处理程序类,当我对robot
进行更改时,我的state
端点在React客户端中出现400错误端点。
对于robot/start/
和robot/stop/
端点,我有一个非常简单的API:
def create_robot_api(api: Api, db: AsyncGetSetDatabase):
robot_endpoint = api.namespace('robot')
robot_model = api.model('Start/Stop', { 'counter': fields.Integer })
def set_counter(action):
counter = request.get_json()['counter']
run(db.set_and_publish(f'{action}_request_counter', counter))
return {'message': f'{action} request counter set to {counter}'}, 200
@robot_endpoint.route('/start/')
class StartRobot(Resource):
@robot_endpoint.expect(robot_model, validate=True)
def post(self):
return set_counter('start')
@robot_endpoint.route('/stop/')
class StopRobot(Resource):
@robot_endpoint.expect(robot_model, validate=True)
def post(self):
return set_counter('stop')
我的state
端点从我的数据库中获取相关的状态:
def create_state_api(api: Api, db: AsyncGetSetDatabase):
state_endpoint = api.namespace('state')
@state_endpoint.route('/')
class SystemState(Resource):
def get(self):
state = {}
props = [ ... ]
# this is old API and won't work.
async def action(_db):
for prop in props:
state[prop] = await _db.get(prop) or 0
# run(db.execute(action)) # 1
# return state # 2
# THIS does the state correctly but causes post not to work!
return run(db.get_keys(props)) #3
我的React应用在启动时会调用get /state/
,并有一个调用post /robot/start/
的按钮(以及一些对get /config/
和post /config/
都起作用的按钮很好)
当第1行和第2行没有注释并且我刷新React应用程序时,state
端点本身会导致Flask中出现错误-TypeError,这是有道理的,因为db
实际上有一个新的API第3行占了-以及chrome中的CORS错误:
CORS策略已阻止从源“ http:// localhost:3000”访问“ http:// localhost:5000 / state /”处的XMLHttpRequest:不存在“ Access-Control-Allow-Origin”标头在请求的资源上。
如果我注释第1行和第2行,并取消注释第3行,则state
端点将按原样返回,并且可以完全正常工作。但是,当我单击post robot/start/
m的UI的开始按钮时,出现错误:
POST http:// localhost:5000 / robot / start / 400(错误请求)
同样奇怪的是,从我的Swagger UI调用post /start/
没有问题。仅来自React应用程序。 FWIW,无论好坏,Flask输出始终显示React的OPTIONS
和POST
。昂首阔步总是POST
。我也尝试过从用户界面中删除get /state/
,然后加载用户界面,然后从Swagger调用get /state/
:在用户界面中开始/停止就可以了。
因此,似乎可以通过get /state/
进行操作,而没有导致UI出错的错误。仅在React应用中。即使将get
端点的整个state
函数替换为return {}
,也会发生此问题。我还尝试过robot
方法只返回200。
我发誓,这一切以前都是可行的。我的redis包装器进行了很多更改,但它们对此不会有任何影响!