handle_error() takes 4 positional arguments but 6 were given

Python Feb 19, 2020

自己的工程代码基于flask写的,最近升级了webargs5.1.3版本之后就会有一个异常错误捕获type error

提示handle_error() takes 4 positional arguments but 6 were given错误

这个错误的意思是,这个handle_error函数需要四个参数,但是给了六个

后边查到webargs的官方文档,我们这里改造一下老版本的handle error函数就可以啦

老版本的handle error 函数,确实是只有四个参数。但是我们升级了webargs,然后我们自己的CustomFlaskParser是继承自FlaskParser这个类的,这个类的handle_error函数是有六个参数的,所以我们重载之后的函数也需要这么多个参数。

FlaskParser类的handle_error函数

    def handle_error(self, error, req, schema, error_status_code, error_headers):
        """Handles errors during parsing. Aborts the current HTTP request and
        responds with a 422 error.
        """
        status_code = error_status_code or self.DEFAULT_VALIDATION_STATUS
        abort(
            status_code,
            exc=error,
            messages=error.messages,
            schema=schema,
            headers=error_headers,
        )

我们自己旧的handle_error函数如下:

    def handle_error(self, error, req, schema):
        web_logger.warning(f'{request.url} - 请求有误,取消处理。状态码 {getattr(error, "status_code", 422)} ,错误原因 {error.messages}')
        super(CustomFlaskParser, self).handle_error(error, req, schema)

根据文档,提示的,大于4.2以上的版本需要改成如下

@parser.error_handler
def handle_error(error, **kwargs):
    raise CustomError(error.messages)


class MyParser(FlaskParser):
    def handle_error(self, error, req, schema, status_code, headers):
        # ...
        raise CustomError(error.messages)

    # OR

    def handle_error(self, error, req, **kwargs):
        # ...
        raise CustomError(error.messages)

我们直接改造新的handle error函数就可以啦,很简单,因为新的版本不兼容,所以参数变了

    def handle_error(self, error, req, schema, status_code, headers):
        web_logger.warning(f'{request.url} - 请求有误,取消处理。状态码 {getattr(error, "status_code", 422)} ,错误原因 {error.messages}')
        super(CustomFlaskParser, self).handle_error(error, req, schema, status_code, headers)

写好后测试通过就可以提交啦(o)/

题图

Tags

壳壳

一个想法不一定对