【问题标题】:Get Flask to serve index.html in a directory获取 Flask 以在目录中提供 index.html
【发布时间】:2016-09-17 08:53:42
【问题描述】:

我在 Flask 中有 2 个静态目录。

静态/

  • css/
  • js/

结果/

  • 1/
    • index.html
    • details.json
  • 2/
    • index.html
    • details.json

我跟着其他几个答案看了一眼the documentation for serving static files

app = Flask(__name__)
app.config['RESULT_STATIC_PATH'] = "results/"

@app.route('/results/<path:file>')
def serve_results(file):
    # Haven't used the secure way to send files yet
    return send_from_directory(app.config['RESULT_STATIC_PATH'], file)

使用以下代码,我现在可以请求results 目录中的文件。

我更熟悉 PHP 和 Apache。假设一个目录有一个index.phpindex.html 文件,它会自动提供。

我的要求:-

  • 访问结果目录中的任何文件
  • 如果我发送localhost:3333/results/1 的请求,我应该得到index.html 的服务

我可以对 Flask 做同样的事情,方法是添加一个路由并检查 index.html 是否存在于子目录中,然后提供它。又找了几个类似的指针here

我目前使用两条路线来获得该功能。当然有更好的方法。

为什么我要包含有关静态目录的详细信息?
我很有可能做错了什么。请告诉我。谢谢:)

【问题讨论】:

  • 不要使用 Flask 来提供静态文件。使用 Nginx 或 Apache。他们在这方面比 Flask 好得多,而且他们都可以按照你想要的方式工作。
  • 这是一个供内部使用的小型测试应用程序。我认为这里的速度/安全性并不重要。它总是在局域网上运行。当我们构建面向客户的东西时会记住这个提示并使用它:)
  • 是的,但你可能会花更多的时间让 Flask 做你想做的事情,而不是设置一个已经可以做到的工具。
  • 不能否认这一点。但在我的情况下,我几乎完成了 Flask 中的所有内容(包括这个问题,正在寻找一种更好的方法来获得这个功能)。我希望我一开始就知道。

标签: python flask


【解决方案1】:

试试这个:

@app.route('/results/<path:file>', defaults={'file': 'index.html'})
def serve_results(file):
    # Haven't used the secure way to send files yet
    return send_from_directory(app.config['RESULT_STATIC_PATH'], file)

这是您为该参数传递默认值的方式。但是,我不同意这一点,如果您想提供静态内容,只需在您的网络服务器中设置规则(在您的情况下为 apache)。

【讨论】:

  • 赞成新指针。我无法让它满足我的两个要求。尝试了不同的路线,我只能满足我的一个要求。
  • 所以您尝试http://localhost:3333/results/onefile.txt 并且它不提供该文件?如果是这样,它会以什么响应?
  • 如果我使用默认值,我必须在路由中找到目录并将其附加到app.config['RESULT_STATIC_PATH']。我说的对吗?
  • 它对我有用,我不知道为什么它对你不起作用。您确定目录结构正确吗? '1' 是目录吧?
  • 是的 1 是一个目录。 /results/anotherdir/onefile.txt 是否打开 onefile.txt 和 /results/anotherdir 打开 index.html?
【解决方案2】:

我正在使用以下单路由解决方案,“默认值”对我不起作用,因为它停止提供任何其他文件。

除了在路径不以斜杠结尾时引发错误之外,您还可以生成到带有斜杠的路径的重定向。没有这个斜线,但提供索引文件会导致相对路径出现问题。

@app.route('/<path:path>')
def staticHost(self, path):
    try:
        return flask.send_from_directory(app.config['RESULT_STATIC_PATH'], path)
    except werkzeug.exceptions.NotFound as e:
        if path.endswith("/"):
            return flask.send_from_directory(app.config['RESULT_STATIC_PATH'], path + "index.html")
        raise e

【讨论】:

  • 谢谢。我的问题早就解决了。如果我需要再次使用 Flask 会记住这一点 :)
【解决方案3】:

我找不到只使用一条路线的解决方案。我最终使用了这个。

@app.route('/results/<path:filename>')
def serve_static(filename):
    return send_from_directory("results/", filename)

@app.route('/results/<guid>')
def index(guid):
  return send_from_directory("results/" + guid, 'index.html')

其他建议

@ipinak 建议使用defaults={'file': 'index.html'} 作为另一个参数。这解决了这个问题,因为它会导致一些安全问题,@ipinak 已经很乐意研究这些问题。 defaults 是一个不错的选择,我也会尝试在我的应用程序的其他地方使用它。

@dirn 在 cmets 中建议使用 Apache/Nginx 来提供静态文件。这将节省时间,因为我不必在 Flask 中实现东西。由于静态文件不必传递给 Python 解释器,因此我们可以通过另一台服务器为它们提供服务,几乎不需要任何额外工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多