Python Flask:导致TypeError的自定义错误处理程序:isinstance()arg 2

Python Flask:导致TypeError的自定义错误处理程序:isinstance()arg 2,python,flask,typeerror,Python,Flask,Typeerror,我在使用Flask和创建自定义错误处理程序时遇到问题。我想将我的错误处理转移到一个单独的类中,并遵循以下文档: 在测试我的新错误处理程序时,返回以下消息 TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types 我相信上面的错误消息是直接来自这个签入烧瓶:但我不理解实际问题或如何解决它 自定义错误类为: class ErrorHandler(Exception): status_

我在使用Flask和创建自定义错误处理程序时遇到问题。我想将我的错误处理转移到一个单独的类中,并遵循以下文档:

在测试我的新错误处理程序时,返回以下消息

TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
我相信上面的错误消息是直接来自这个签入烧瓶:但我不理解实际问题或如何解决它

自定义错误类为:

class ErrorHandler(Exception):
    status_code = 400

    def __init__(self, message, status_code=None, payload=None):
        Exception.__init__(self)
        self.message = message
        if status_code is not None:
            self.status_code = status_code
        self.payload = payload

    def to_dict(self):
        rv = dict(self.payload or ())
        rv['message'] = self.message
        return rv
@app.errorhandler(ErrorHandler)
def bad_request(error):
    response = jsonify(error.to_dict())
    response.status_code = error.status_code
    return response

@app.route('/', methods=['GET', 'POST'])
def testing():
    if request.method == 'GET':
        raise ErrorHandler('test', 400)
    elif request.methods == 'POST':
         pass
    else:
         pass
正在运行以调用此类的代码是:

class ErrorHandler(Exception):
    status_code = 400

    def __init__(self, message, status_code=None, payload=None):
        Exception.__init__(self)
        self.message = message
        if status_code is not None:
            self.status_code = status_code
        self.payload = payload

    def to_dict(self):
        rv = dict(self.payload or ())
        rv['message'] = self.message
        return rv
@app.errorhandler(ErrorHandler)
def bad_request(error):
    response = jsonify(error.to_dict())
    response.status_code = error.status_code
    return response

@app.route('/', methods=['GET', 'POST'])
def testing():
    if request.method == 'GET':
        raise ErrorHandler('test', 400)
    elif request.methods == 'POST':
         pass
    else:
         pass
已解决:

更改了我从

import ErrorHandler


异常表示传递给
@app.errorhandler()
装饰器的内容不是类

isinstance()
测试将给出引发的异常(
ErrorHandler('test',400)
,以及传递给
@app.ErrorHandler()
的任何内容。异常告诉您后一个值不是类:

>>> class Foo(Exception): pass
... 
>>> isinstance(Foo(), Foo)
True
>>> isinstance(Foo(), 'something else')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
>类Foo(异常):通过
... 
>>>isinstance(Foo(),Foo)
符合事实的
>>>isinstance(Foo(),'something other')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:isinstance()arg 2必须是类、类型或类和类型的元组

双重检查和三重检查您有正确的对象。

您的异常子类的名称为
errorhandler
,请注意
d
l
的换位。您在
@app.ErrorHandler()
中注册的
ErrorHandler
可能不是一个类型,而是一个完全不同的类型。哎呀,我会解决这个问题,但我担心这仍然不是问题所在。导致异常的原因是,您传递到
@app.ErrorHandler()
中的任何内容都不是类,因此
就是实例(thrownexception,ErrorHandler)
因该错误而失败。谢谢。它应该来自ErrorHandler导入ErrorHandler。请参阅,这就是为什么PEP-8建议对模块使用小写名称,对类使用驼峰大小写。:-)