Flask在生产环境中的静态文件

5
通常情况下,问题在于如何在开发环境中提供静态文件,但在我的情况下却相反。因此,我使用Apache和mod_wsgi部署了一个Flask应用,并将Apache配置为在/static URL上提供静态文件。现在我不确定这些文件是由Apache还是Flask提供的,因为Flask默认也会在相同路径下使用静态文件。
在模板中,我使用url_for("static", filename="style.css")。它很好地工作了。但这就是问题所在,因为我不知道谁在提供我的静态文件。当然,如果我更改每个模板以具有硬编码的路径并且与默认Flask不同,则可以确定Apache正在提供服务,但这似乎不是正确的解决方法。
因此,总结一下我的问题:如何在Flask(模板)中使用url_for(static)并确保Flask没有为我提供服务?
谢谢, Rapolas K.
2个回答

6
  1. Set another static folder (you will need also create empty folder on file system):

    app = Flask(__name__, static_url_path='static', static_folder='static_test')
    

    So if you get 404 then files serving by flask else apache.

  2. Add test folder and map apache as for static folder.

    So if you get content from test folder then files serving by apache else flask.

  3. Break any static endpoint requests:

    @app.before_request
    def break_static():
        if request.endpoint == 'static':
            abort(404)
        return None
    

    or

    class YourApp(Flask):
        def send_static_file(self, filename):
            abort(404)
    

    So if you get 404 then files serving by flaks else apache.

但是如果你确实不确定,你可以测试一下这个案例。如果Apache配置没有改变,那么静态服务的行为也不会改变。


1
谢谢,这回答了我的问题。在第一步之后,我知道文件是由Flask提供的,而不是Apache。所以看起来是一个解决方法,添加一些虚假的static_folder选项到Flask应用程序中,否则不清楚是什么提供了这些静态文件...但是还有一个问题,Flask是否总是尝试提供静态文件会有性能损失。 - Rapolas K.
可能是您的Apache配置有误,因为在正确的设置下,Apache必须从设置的目录处理这些文件。 - tbicr
我故意更改了Apache配置以便服务于不同的目录,以验证Flask是否也在服务这些文件。这是我的担忧,如果Flask和Apache都从同一个目录中提供服务,我就无法知道哪个优先级更高。将Flask设置为服务空目录后,我现在可以确定Apache正在处理静态文件。 - Rapolas K.

0

只要你拥有这个,你就可以放心:

if __name__ == '__main__':
    app.run()

app.run() 调用实际上启动了本地开发服务器。在生产环境中,您将不应该调用它,因此开发服务器不会启动任何服务,因为它从未启动。


我不确定这一点。如果我更改Apache以在不同的路径上提供文件,则这些文件仍可通过旧的Flask静态路径访问,以及新的Apache路径。但是url_for生成的是Flask路径,而不是由Apache提供的路径。 - Rapolas K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接