【问题标题】:Catch-all URL with Flask when the path also contains a URL当路径还包含 URL 时,使用 Flask 捕获所有 URL
【发布时间】:2014-06-03 14:04:26
【问题描述】:

好的,所以我想用这段代码捕获我的 Flask 应用程序中的所有 URL

@app.route('/<path:path>')
def catch_all(path):
    return path

只是一个显示每个页面的相对路径的基本应用程序。所以这适用于大多数路径(localhost/whatever/I/want 例如打印whatever/I/want)。

除了一种情况。例如,如果我在 URL 栏中输入localhost/foo/http://google.com/bar,我期望显示的是foo/http://google.com/bar,但我实际得到的只是bar。所以实际上 Flask 会找到最后一个有效的 URL 并采用该 URL 后面的路径。

有没有办法捕捉到我们 URL 的真实路径?

编辑:我正在使用 Google App Engine for Python 运行 Flask 0.10。

【问题讨论】:

  • 我无法使用 Flask-0.10.1 重现您的问题,因为我在访问 http://localhost:8000/foo/http://google.com/bar 时得到了 foo/http://google.com/bar 的预期输出。
  • Flask(和 Werkzeug)确实按照您描述的方式行事。您确定您没有运行任何中间件或 WSGI 服务器来代替您执行此操作吗?
  • 我从 Google App Engine Python 页面引导我的项目:developers.google.com/appengine/docs/python/…,所以我猜有 App Engine WSGI。有人知道怎么解决吗?
  • 这确实是 Google SDK 所做的,而不是 Flask。我设法用当前的 SDK 重现。

标签: python google-app-engine url flask


【解决方案1】:

我能够使用当前的 Google App Engine SDK 重现您的问题;这是由捆绑的 CherryPy 服务器解析请求的方式引起的。

该问题适用于您的本地开发服务器,当您将应用程序部署到 Google 时,不同的处理程序会解析 URI,而 http:// 方案未解析。

请参阅 CherryPy issue #1284 以及相应的 appengine devserver ticket

解决方法是对冒号进行 URI 编码:

http://localhost:8000/foo/http%3A//google.com/bar

有效。

【讨论】:

    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 2021-03-27
    • 2015-08-25
    • 1970-01-01
    • 2013-07-12
    相关资源
    最近更新 更多