Python烧瓶URI深度

Python烧瓶URI深度,python,flask,uri,Python,Flask,Uri,我想知道在RESTAPI的上下文中,如果URI“太长”,如何抛出异常或错误 例如: http://127.0.0.1:5000/foo/ 及 在我的应用程序的参数范围内是可接受的,但不应允许以下情况: http://127.0.0.1:5000/foo/bar/go “go”可以是任何东西,包括一长串的胡言乱语。当前,当我在此处输入字符串时,应用程序将返回一个空白的jsonified输出 如果用户试图输入超出第三个斜杠的内容,我想返回一个错误 这里最大的问题是条目“bar”可以合法地有一个反

我想知道在RESTAPI的上下文中,如果URI“太长”,如何抛出异常或错误

例如:

http://127.0.0.1:5000/foo/

在我的应用程序的参数范围内是可接受的,但不应允许以下情况:

http://127.0.0.1:5000/foo/bar/go
“go”可以是任何东西,包括一长串的胡言乱语。当前,当我在此处输入字符串时,应用程序将返回一个空白的jsonified输出

如果用户试图输入超出第三个斜杠的内容,我想返回一个错误

这里最大的问题是条目“bar”可以合法地有一个反斜杠(例如,
b/ar
),所以我也尝试对此进行设置

为了提供更多的上下文信息,下面是一段代码,它进行了一些特殊处理:

@app.route('/foo/<path:bar>', methods=['GET'])
def list_single_bar(bar):
    for i in [";"]:
        if i in bar:
            bar = bar.replace(i,"")
    for i in [" / ",": "," "," & ","@","#"]:
        if i in bar:
            bar = bar.replace(i,"-")
@app.route('/foo/',方法=['GET'])
def列表_单个_条(条):
因为我在[“;”]:
如果我在酒吧:
条=条。替换(i,“”)
对于[“/”、“:”、“、”&“、“@”、“#”]中的i:
如果我在酒吧:
条=条。替换(i,“-”)
非常难看,但我基本上是在尝试规范化URI字符串的这一部分,以便我可以将其传递给构建URL字符串,并从网站获得一些结果


正在构建的URL主要用破折号字符代替空格。

因为您使用的是
flask将匹配
/foo/
之后的几乎所有内容。您是否考虑过检查
条的长度并引发异常?Flask支持自定义错误处理程序,如下所示:谢谢!嗯,我突然想到要检查长度,但唯一的问题是“bar”理论上可能是一个相当长的字符串。如果我将最大长度设置为30个字符,如果我输入一个较短的字符串,后跟其他目录,我是否还会遇到同样的问题?我之所以需要path:too是为了解释字符串中的反斜杠。。。听起来这是一把双刃剑。因此,也许你应该做的不是在URI中接受一个有条件的长字符串,而是让消费应用程序在主体中发布给你的路径。这样,至少,您不会与Flask的路由器限制抗争,并且可以完全控制请求的结果。啊,这样看起来就像页面上的用户输入表单,您可以在其中输入字符串,然后将其解析并作为POST请求传递。而不是直接打开有人篡改或捏造URL的可能性。
@app.route('/foo/<path:bar>', methods=['GET'])
def list_single_bar(bar):
    for i in [";"]:
        if i in bar:
            bar = bar.replace(i,"")
    for i in [" / ",": "," "," & ","@","#"]:
        if i in bar:
            bar = bar.replace(i,"-")