Python 让Flask在目录中提供index.html

Python 让Flask在目录中提供index.html,python,flask,Python,Flask,我在Flask中有2个静态目录 静止的/ css/ js/ 结果/ 1/ index.html details.json 2/ index.html details.json 我接着回答了其他几个问题并浏览了一遍 app=Flask(\uuuuu name\uuuuuu) app.config['RESULT\u STATIC\u PATH']=“results/” @app.route(“/results/”) def SERVER_结果(文件): #尚未使用安全方式发送文件

我在Flask中有2个静态目录

静止的/
  • css/
  • js/
结果/
  • 1/
    • index.html
    • details.json
  • 2/
    • index.html
    • details.json
我接着回答了其他几个问题并浏览了一遍

app=Flask(\uuuuu name\uuuuuu)
app.config['RESULT\u STATIC\u PATH']=“results/”
@app.route(“/results/”)
def SERVER_结果(文件):
#尚未使用安全方式发送文件
从目录返回发送目录(app.config['RESULT\u STATIC\u PATH'],文件)
使用以下代码,我现在可以请求
results
目录中的文件

我更熟悉PHP和Apache。比如说,如果一个目录有一个
index.php
index.html
文件,它将自动提供服务

我的要求:-

  • 访问结果目录中的任何文件
  • 如果我发送了对
    localhost:3333/results/1
    的请求,我应该得到
    index.html
我可以通过添加一个路由,检查子目录中是否存在index.html,然后为其提供服务,从而对Flask执行相同的操作。我找到了一些类似的指针

我目前使用两种途径来获得功能。当然还有更好的办法

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

试试这个:

@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)
@app.route('/results/',默认值={'file':'index.html'})
def SERVER_结果(文件):
#尚未使用安全方式发送文件
从目录返回发送目录(app.config['RESULT\u STATIC\u PATH'],文件)

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

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

@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')
@app.route(“/results/”)
def SERVER_静态(文件名):
从目录返回发送目录(“结果/”,文件名)
@app.route(“/results/”)
def索引(guid):
从目录返回发送目录(“results/”+guid,'index.html')
其他建议 @ipinak建议使用
defaults={'file':'index.html'}
作为另一个参数。并不能解决这个问题,因为它会导致@ipinak非常愿意研究的一些安全问题。
defaults
是一个简洁的选项,我也会尝试在应用程序的其他地方使用它


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

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

当路径没有以斜杠结束时,您可以生成指向该路径的重定向,而不是引发错误。没有此斜杠,但为索引文件提供了会导致相对路径出现问题的斜杠

@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
@app.route(“/”)
def静态主机(自身,路径):
尝试:
从目录(app.config['RESULT\u STATIC\u PATH'],PATH)返回flask.send\u
除了werkzeug.exceptions.Not作为e:
如果路径.endswith(“/”):
从目录返回flask.send(app.config['RESULT\u STATIC\u PATH'],PATH+“index.html”)
提高e

投票支持新指针。我无法使它同时满足我的两个要求。尝试了不同的路线,我只能满足我的一个要求。所以你尝试
http://localhost:3333/results/onefile.txt
但它不提供该文件?如果是这样,它的响应是什么?如果使用默认值,我必须在路由中找到目录并将其附加到
app.config['RESULT\u STATIC\u PATH']
。我说的对吗?它对我有效,我不知道为什么它对你无效。您确定目录结构正确吗?“1'是一个目录,对吗?是
1
是一个目录。/results/anotherdir/onefile.txt是否打开onefile.txt和/results/anotherdir是否打开index.html?不要使用Flask提供静态文件。使用Nginx或Apache。他们在这方面比Flask做得好得多,而且他们都按照你想要的方式工作。这是一个供内部使用的小型测试应用程序。我认为速度/安全在这里不重要。它总是在局域网上运行。我们将记住这一技巧,并在构建面向客户的东西时使用它:)是的,但是您可能要花更多的时间让Flask做您想做的事情,而不是设置一个已经做了的工具。不能否认这一点。但在我的例子中,我几乎完成了Flask中的所有内容(包括这个问题,我正在寻找一种更好的方法来获得这个功能)。我希望一开始就知道。谢谢。我的问题早就解决了。如果我需要再次使用Flask,请记住这一点:)
@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