当更改*不同*端点时,烧瓶请求失败(400)

时间:2020-09-02 18:03:56

标签: python reactjs flask

我的应用程序运行良好,然后我开始重新设计我的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的OPTIONSPOST。昂首阔步总是POST。我也尝试过从用户界面中删除get /state/,然后加载用户界面,然后从Swagger调用get /state/:在用户界面中开始/停止就可以了。

因此,似乎可以通过get /state/进行操作,而没有导致UI出错的错误。仅在React应用中。即使将get端点的整个state函数替换为return {},也会发生此问题。我还尝试过robot方法只返回200。

我发誓,这一切以前都是可行的。我的redis包装器进行了很多更改,但它们对此不会有任何影响!

0 个答案:

没有答案