带有URI编码组件的Flask路由

sho*_*app 19 python flask

Flask似乎不支持带有URI编码组件的路由.如果我做错了,或者我需要包含一个特殊标志,我很好奇.

我的路线看起来像这样:

@app.route('/foo/<encoded>/bar/')
def foo(encoded):
  # ...
  pass
Run Code Online (Sandbox Code Playgroud)

此匹配的URL可能如下所示:

http://foobar.com/foo/xxx/bar/ # matched correctly, no URI component
http://foobar.com/foo/x%2Fx%2Fx%2F/bar/ # not matched correctly, URI component
Run Code Online (Sandbox Code Playgroud)

以前的URL工作,后者吐出一个可爱的404.

谢谢!

unm*_*ted 26

添加path到您的网址规则:

@app.route('/foo/<path:encoded>/bar/')

每条评论更新:路线API文档位于:http://flask.pocoo.org/docs/api/#flask.Flask.route.实现path样式路由转换器的基础类在这里:http://werkzeug.pocoo.org/docs/routing/#custom-converters(这是pocoostan非常好的部分之一.)至于尾部斜杠,有一些特殊规则相当于:

如果规则以斜杠结尾并且在没有用户斜杠的情况下请求,则会自动将用户重定向到附加了斜杠的同一页面.

如果规则不以尾部斜杠结束,并且用户请求具有尾部斜杠的页面,则会引发404未找到.

另外请记住,如果您使用的是Apache并且期望使用斜线跟踪的URL,即提交http://ex.com/foo/<path:encoded>/barencoded使用双斜杠获取内容的bookmarklet ,Apache会将多个斜杠转换为单个斜杠.

  • 如果其他人有同样的问题:我花了一分钟才意识到我们正在添加`path`,而不是添加`encoded`.我试过并且没有添加一个`encoded`后置滤波器而不是一个`path`前置滤波器. (4认同)