捕获烧瓶应用程序中的所有路径

Posted

技术标签:

【中文标题】捕获烧瓶应用程序中的所有路径【英文标题】:Catch all path in flask app 【发布时间】:2014-02-14 02:49:18 【问题描述】:

我用 Angular + Flask 编写了一个应用程序,托管在 heroku 上。我一直在寻找使用 html5mode 来使用 myapp.co/register 进行 oauth。 html5mode 的问题是,如果有人刷新页面或单击非 root 的链接,服务器需要重写 url。我尝试使用thissn-p 将它们全部捕获,但它不起作用。

@app.route("/", defaults="path": "")
@app.route("/<path:path>")
def index(path):
  print path
  return make_response(open(app.static_folder + "index.html").read())

输出 404

 * Restarting with reloader
127.0.0.1 - - [23/Jan/2014 13:41:48] "GET /ass HTTP/1.1" 404 -

应用程序获得了服务器 index.html 和 /api/v1/ 即 RESTful api 的根

【问题讨论】:

【参考方案1】:

如果您没有更多优先级更高的路线,您的代码将捕获所有网址。但是看起来它应该返回500错误(因为我希望你没有&lt;app_path&gt;/staticindex.html并使用不安全的方法发送文件)。

因此,如果您有其他规则,则必须查看规则优先级(请参阅https://***.com/a/17146563/880326)。

如果您对这条路线有错误,请使用:

@app.route("/", defaults="path": "")
@app.route("/<path:path>")
def index(path)
    return send_from_directory(app.static_folder, "index.html")

【讨论】:

谢谢。不安全是指 url 映射到文件路径? send_from_directory 有什么好处? 是的,有人可以尝试使用 send ../~/ 到路径(可能它不适用于 URL,但您可能可以通过任何其他方式获取它)。 send_from_directory(参见flask.pocoo.org/docs/api/#flask.send_from_directory)足够聪明,可以避免使用safe_join 的目录的相对路径,并有很多send_file 的选项。例如烧瓶static 使用的路由send_from_directory。它有利于开发,但对于生产来说,最好使用 nginx 处理此文件,或者如果您愿意,可以将其替换为 CDN URL。 对于使用 Flask 和 AngularJS 的任何人,如果您希望您的应用程序在 Angular 上显示当前路由而不是在刷新页面时吐出 404,请使用 @app.route("/") 并将路径参数设置为无。 我必须从烧瓶初始化中删除“static_url_path”才能使其工作【参考方案2】:

你需要使用比你拥有的更多的东西:

@app.route("/", defaults="path": "")
@app.route("/<string:path>") <--- this is missing
@app.route("/<path:path>")
def index(path):
  print path
  return make_response(open(app.static_folder + "index.html").read())

所以:

@app.route("/<string:path>")

不见了。它捕获字符串变量(不是路径),所以在你的例子中只是ass,当你尝试点击http://localhost:5000/ass时。

【讨论】:

我想知道为什么官方文档中没有这个。见:Flask | Single-Page Applications

以上是关于捕获烧瓶应用程序中的所有路径的主要内容,如果未能解决你的问题,请参考以下文章

Angular observable 没有从烧瓶服务器捕获新值

如何将装饰器应用于烧瓶中的所有蓝图 url

将Mongodb中的日志呈现到烧瓶路径中

如何实现无状态烧瓶 webapp

如何循环浏览烧瓶/python中的表单?

如何确保烧瓶应用程序已在所有路线上获得授权?