【问题标题】:Zero-length URL Segments零长度 URL 段
【发布时间】:2013-05-12 15:11:16
【问题描述】:

使用最新版本的 Flask 和 Flask-RESTful,我定义了一些非常基本的路由:

def build_uri_rules(uri_map):
    for cls, uri in uri_map.iteritems():
        api.add_resource(cls, uri)


uris = {
    SampleController: '/samples/<string:hash_or_id>',
    SampleFamilyController: '/samples/<string:hash_or_id>/family',
}

build_uri_rules(uris)

这适用于“正确”请求的 uris,但是如果 /samples/ 端点在没有参数的情况下被命中,或者 sample*family 端点被空样本 id 命中怎么办?目前,这会导致 404 错误。这工作得很好,但我认为正确的做法是抛出 400 错误,因为他们找到了正确的 URL,但他们的数据结构不正确。有没有办法可以强制这种行为?

附带说明: 浏览 Werkzeug 文档,我看到 werkzeug.routing 允许某些 url 参数的最小长度,但我也看到它的最小值为 1。诚然,我没有寻找为什么会这样,但会这样吗是适合吠叫的树吗?还是我应该简单地创建一个全局 404 处理程序来检查参数的长度并从那里引发 proper 错误?

谢谢!

已编辑:为了代码的正确性。

【问题讨论】:

    标签: python-2.7 flask werkzeug


    【解决方案1】:

    我会说点击/samples//samples/family(甚至/samples//family应该导致 404,因为该端点没有任何内容。

    但是,如果您不想这样做,处理它的最简单方法是为 just /samples//samples/family 创建一个 404 处理程序,它返回一个注释,其中包含有关什么的更多信息您的 API 的使用者很可能做错了。

    uris = {
        Explanitory400Controller: '/samples/',
        SampleController: '/samples/<string:hash_or_id>',
        Explanitory400Controller: '/samples/family',
        SampleFamilyController: '/samples/<string:hash_or_id>/family',
    }
    

    【讨论】:

    • 这基本上就是我们正在做的事情,但我使用了一些技巧来解析 build_uri_rules 中的 uri 定义。 (基本上,我在每个字符串上循环并删除它的变量部分,并将其绑定到 400 控制器,它只是简单地中止并显示错误消息。)我们还使用了一些反射来允许用户点击/ 并获取所有端点的列表,在我们的案例中这应该可以减轻混淆。感谢您的回答,因为它为其他人提供了一些关于 400 与 404 的信息,并解释了两者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2017-12-31
    • 1970-01-01
    相关资源
    最近更新 更多