FlaskRebar规则验证

2024-09-26 17:52:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在使用Flask-Rebar构建的restapi中验证Flask规则。我试过以下方法:

@registry.handles(
    rule='/horses/<int:horse_id>',
    method='GET',
    marshal_schema=GetHorseByIdSchema()
)
def getHorseById(horse_id):
    return {"horse_id": horse_id}

这是使用指定的<int:my_var>语法here。当输入一个整数值作为horse_id时,一切正常。问题来自于输入一个非整数值,即a;当我期望一个400 Bad Request时,这会抛出一个404 Not Found状态代码。在

我不认为我可以使用任何编组模式来实现这一点,所以我不确定下一步要做什么,任何帮助都将不胜感激。在

谢谢, 亚当


Tags: 方法restapiidflaskget规则rulemethod
1条回答
网友
1楼 · 发布于 2024-09-26 17:52:25

这就是Flask/Werkzeug的行为方式,因此它有点超出了Flask Rebar的控制范围。也就是说,下面还将为/horses/a返回404:

app = Flask(__name__)

@app.route('/horses/<int:horse_id>')
def getHorseById(horse_id):
    return str(horse_id)

下面是一些解决方法:

(1)自定义URL转换器:http://flask.pocoo.org/docs/1.0/api/#flask.Flask.url_map

这看起来像:

^{pr2}$

但是,路由是在应用程序上下文之外完成的,所以我们不能使用烧瓶.jsonify也不能通过烧瓶Rebar的错误来引发漂亮的JSON错误。在

(2)检查handler函数内的类型

from flask_rebar.errors import BadRequest

@registry.handles(
    rule='/horses/<horse_id>',
    method='GET',
    marshal_schema=GetHorseByIdSchema()
)
def getHorseById(horse_id):
    try:
        horse_id = int(horse_id)
    except ValueError:
        raise BadRequest('horse_id must be an integer')
    return {'horse_id': horse_id}

这有点不太优雅,但很管用。 Swagger文档将默认为horse_id参数的字符串类型,但我们也可以解决这个问题:

^{4}$

(3)接受烧瓶/Werkzeug行为

根据你需要400而不是404的程度,最实际的做法可能是什么都不做,只是屈服于Flask/Werkzeug是如何做到的。在

相关问题 更多 >

    热门问题