【问题标题】: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 的根

【问题讨论】:

    标签: javascript python html angularjs flask


    【解决方案1】:

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

    因此,如果您有其他规则,则必须查看规则优先级(请参阅https://stackoverflow.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时。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2020-11-02
    • 2018-07-26
    • 1970-01-01
    • 2013-09-04
    • 2021-05-20
    相关资源
    最近更新 更多