【问题标题】:Flask : How to serve static files from template directory?Flask:如何从模板目录提供静态文件?
【发布时间】:2012-12-09 17:51:56
【问题描述】:

我正在使用 Flask 开发一个 SAAS 应用程序,我希望用户能够创建/上传/使用他们自己的自定义模板。这就是我现在的目录结构:

/flaskapp
    /application.py
    /static
        /style.css
    /templates (site & admin templates goes here)
        /hello.html
    /userdata
        /user1
            /template1
                 hello.html
            /template2
                 hello.html
        /user2
            /template1
                 hello.html
            /template2
                 hello.html

我可以使用通过这个 * 问题找到的解决方案为用户指定的模板提供服务:How to dynamically select template directory to be used in flask? 但我如何从模板目录提供静态文件。而不是从/flaskapp/static/ 提供静态文件,我想使用/flaskapp/userdata/<user>/<current-template>/static/ 目录提供静态文件,该目录将在运行时动态确定。如何做到这一点?

【问题讨论】:

  • /flaskapp/something 是指 URL 还是目录名称?请每次都说:用该目录中的静态文件提供此 URL。否则我就是不明白你的意思。
  • /flaskapp/something 指的是目录而不是 URL。

标签: python flask jinja2


【解决方案1】:

大概你在 Flask 前面使用了一个网络服务器。解决此问题的一种方法(我通常在将 Apache + mod_wsgi 用于自定义 WSGI 应用程序时使用)是通过 Web 服务器直接从磁盘提供目录。在 Apache 上,我只是为此使用 Alias 指令。

如果您想改变每个用户在给定 URL 下提供的文件,则必须通过 Flask 管道传输文件。您必须弄清楚如何正确路由请求;之后,您也许可以使用wsgi.file_wrapper 发送正确的文件(尽管我不确定您是如何通过 Flask 获得的)。

【讨论】:

    【解决方案2】:

    这是我用来从任何系统目录提供文件的工具。

    应用程序在特定目录中搜​​索特定请求的文件:

    当有人访问 http:/host/where/to/serve/files/example_file.txt 时,应用程序将尝试返回 example_file.txt 作为附件,如果文件不存在,它将返回 404。

    您可以调整它并使用您的用户变量构建 DIRECTORY_TO_SERVE_PATH。

    如果您有任何限制,您还应该验证要提供的文件,因为这会返回路径中存在的任何文件

    import os
    from flask import abort, send_from_directory
    
    
    DIRECTORY_TO_SERVE_PATH = '/where/files/are/in/disk/'
    
    
    @app.route('/where/to/serve/files/<path:filename>')
    def download_file(filename):
        if os.path.exists(DIRECTORY_TO_SERVE_PATH + filename):
            return send_from_directory(DIRECTORY_TO_SERVE_PATH, filename, as_attachment=True)
        else:
            abort(404)
    

    【讨论】: