gpt4 book ai didi

Python - Flask Api 异常

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:31 24 4
gpt4 key购买 nike

我目前正在开发我的 api,并希望实现一种机制,可以在任何时候引发自定义异常并返回 json 响应:

class InvalidUsage(Exception):
def __init__(self, message):
Exception.__init__(self)
self.message = message

def to_json(self):
return JsonResponse(False, self.message)()

class JsonResponse(object):
def __init__(self, success, data):
self.success = success
self.data = data

if not success:
self.result = {
'success': self.success,
'error': self.data
}
else:
self.result = {
'success': self.success,
'data': self.data
}

def __call__(self):
return jsonify({'result': self.result})

当我尝试在任何 Controller 中使用它时:

raise InvalidUsage('Some error ocurred').to_json()

它只是打印回溯到:

raise InvalidUsage('Some error ocurred').to_json()

但是 JsonResponse 工作得很好。当我运行时:

return JsonResponse(False, 'Some error ocurred')()

它会向我的浏览器返回正确的 json。

但是我需要让我的异常以某种方式工作......这样我就可以在我的 python-webapp( Controller 、服务、验证器等)中的任何点引发 api 异常

有人可以帮我弄清楚如何做到这一点吗?

谢谢并问候!

最佳答案

首先,如果要调用父类的构造函数,应该调用super

class InvalidUsage(Exception):
def __init__(self, message):
super(InvalidUsage, self).__init__()
self.message = message

其次,覆盖 __call__ 不仅丑陋而且是个坏主意。您应该实现显式方法,或者定义自定义 __repr__ 因为 JSON 只是一个字符串。

第三,

self.result = {
'success': self.success,
'data': self.data
}

ifelse上执行。为什么你还要有一个if?为什么不:

class JsonResponse(object):
def __init__(self, success, data):
self.success = success
self.data = data

def __repr__(self):
return json.dumps({'success': self.success, 'data': self.data})

如果代码中的其他地方没有使用这个类,那么它就会变得更加毫无意义。

第四,当你想引发自定义异常时,你应该引发类InvalidUsage而不是其中的特定方法。

raise InvalidUsage("terrible usage")
<小时/>

你真的应该清楚地思考你在这里做什么。您正在抛出异常。您不能将 Flask.Response() 对象的实例作为异常抛出。您可以做的是抛出自定义 InvalidUsage 异常,捕获它,然后返回您的 json 响应:

class InvalidUsage(Exception)
pass


def horrible_code():
raise InvalidUsage("something went wrong.")


try:
horrible_code()

except InvalidUsage as error:
return jsonify({"success": "nope", "error_message": str(error)})

关于Python - Flask Api 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44861173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com