当客户端尝试获取不存在的元素时无法在 Flask 上发送 404 HTTP 状态
Failing to send 404 HTTP status on Flask when client tries to get a nonexistent element
在 Python/Flask 应用程序中,我已经定义了这个端点,如果客户端试图获取我的数据库中不存在的 ID,我希望 return 404。
例如:
@app.route('/plants/<int:plant_id>', methods=['GET'])
def get_plant(plant_id):
try:
plant = Plant.query.filter(Plant.id == plant_id).one_or_none()
if plant is None:
abort(404)
return jsonify({
'success': True,
'plant': plant.format()
})
except:
abort(422)
问题是当我尝试执行它时,它似乎总是引发异常并且 returns 422。
如果我删除 try/except 语法,它会按预期工作并且 return 是 404。但是我失去了处理异常的能力......所以这不是我的解决方案。
为什么我做错了?我如何在不将 404 设置为例外的情况下正确触发 404 return?
谢谢!!
好吧,终于能够理解并解决了。我 post 我在这里的发现,所以也许它可以帮助将来的人。 :)
答案很基本,实际上:每次我中止时,我都会触发异常。
所以,当我中止时,无论我使用什么状态代码,我都会陷入我的 except 语句,默认返回 422。
我解决它的方法是实现一个自定义的 RequestError,每次我有一个受控错误时,我都会触发我的自定义错误,我可以单独控制哪个输出。
这是我的自定义错误的实现:
class RequestError(Exception):
def __init__(self, status):
self.status = status
def __str__(self):
return repr(self.status)
而且我已经更改了我的路由实现,如下所示:
(请注意,我现在首先处理自定义错误异常,然后才触发一般 422 错误)
@app.route('/plants/<int:plant_id>', methods=['GET'])
def get_plant(plant_id):
try:
plant = Plant.query.filter(Plant.id == plant_id).one_or_none()
if plant is None:
raise RequestError(404)
return jsonify({
'success': True,
'plant': plant.format()
})
except RequestError as error:
abort(error.status)
except:
abort(422)
就是这样! \o/
在 Python/Flask 应用程序中,我已经定义了这个端点,如果客户端试图获取我的数据库中不存在的 ID,我希望 return 404。
例如:
@app.route('/plants/<int:plant_id>', methods=['GET'])
def get_plant(plant_id):
try:
plant = Plant.query.filter(Plant.id == plant_id).one_or_none()
if plant is None:
abort(404)
return jsonify({
'success': True,
'plant': plant.format()
})
except:
abort(422)
问题是当我尝试执行它时,它似乎总是引发异常并且 returns 422。
如果我删除 try/except 语法,它会按预期工作并且 return 是 404。但是我失去了处理异常的能力......所以这不是我的解决方案。
为什么我做错了?我如何在不将 404 设置为例外的情况下正确触发 404 return?
谢谢!!
好吧,终于能够理解并解决了。我 post 我在这里的发现,所以也许它可以帮助将来的人。 :)
答案很基本,实际上:每次我中止时,我都会触发异常。 所以,当我中止时,无论我使用什么状态代码,我都会陷入我的 except 语句,默认返回 422。
我解决它的方法是实现一个自定义的 RequestError,每次我有一个受控错误时,我都会触发我的自定义错误,我可以单独控制哪个输出。
这是我的自定义错误的实现:
class RequestError(Exception):
def __init__(self, status):
self.status = status
def __str__(self):
return repr(self.status)
而且我已经更改了我的路由实现,如下所示: (请注意,我现在首先处理自定义错误异常,然后才触发一般 422 错误)
@app.route('/plants/<int:plant_id>', methods=['GET'])
def get_plant(plant_id):
try:
plant = Plant.query.filter(Plant.id == plant_id).one_or_none()
if plant is None:
raise RequestError(404)
return jsonify({
'success': True,
'plant': plant.format()
})
except RequestError as error:
abort(error.status)
except:
abort(422)
就是这样! \o/