2013-05-17 45 views
0

使用瓶和最新版本的瓶的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) 

这适用于要求“正确”的URI,但如果在/样本/终点命中不带参数或样品*家庭端点击中空的样本ID?目前,这会导致404错误。此作品不够好,但我相信这里正确的事情将是抛出一个400错误,因为他们找到了适当的URL但其数据结构不合理。有没有办法可以强制这种行为?

附注: 翻阅Werkzeug文档,我发现werkzeug.routing允许某些url参数的最小长度,但我也看到它的最小值为1.无可否认,我没有看为什么会出现这种情况,但这是否会成为吠叫的正确选择?或者我应该相当简单地创建一个全球性的404处理器,它检查参数的长度,并从那里提高适当错误?

谢谢!

EDITED:对于代码的正确性。

回答

1

我要说的是打/samples//samples/family(甚至/samples//family应该结果在404,因为其中没有在该端点。

但是,如果你想做的事,否则,处理它会为来创建一个404处理器的最简单的方法只是/samples//samples/family一个返回注意到更多有关你的API的消费者最有可能做错了。

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

这实际上是我们正在做的,但我使用一些技巧来解析build_uri_rules中的uri定义。 (基本上,我遍历每个字符串和除去它的可变部,和绑定到一个控制器400,其简单地与该错误消息中止。)我们也使用比特反射的,以允许用户打/并获得所有端点的列表,这应该可以缓解我们的情况中的混淆。感谢这个答案,因为它带来了曙光他人400 VS 404,并解释了两者。 – bbenne10