0

在 Python/Flask 应用程序中,我定义了这个端点,如果客户端试图获取我的数据库中不存在的 id,我希望返回 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)

问题是当我尝试执行它时,它似乎总是引发异常并返回 422。

在邮递员返回 422 时获取不存在的植物

如果我删除 try/except 语法,它会按预期工作并返回 404。但我失去了处理异常的能力......所以它不是我的解决方案。

为什么我做错了?在不将 404 设置为异常返回的情况下,如何正确触发 404?

谢谢!!

4

1 回答 1

0

好的,终于我能够理解并解决它。我在这里发布我的发现,所以也许它可以帮助将来的人。:)

实际上,答案非常基本:每次中止时,都会触发异常。所以,当我中止时,无论我使用什么状态码,我都陷入了我的 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/

于 2021-07-31T18:47:29.767 回答