gpt4 book ai didi

python - 在生产中从 CDN 而不是 Flask 提供静态文件

转载 作者:太空狗 更新时间:2023-10-29 20:10:44 24 4
gpt4 key购买 nike

在我的 Flask 应用程序中,我通过开发环境中的应用程序提供静态 Assets ,但我想在生产环境中使用 CDN。每个 Assets 都加载到一个名为 base.html 的模板中,所以我想最简单的解决方案是将一个变量传递给渲染函数并在模板中使用它,例如:

<script src="{{ STATIC_URL }}/js/main.js"></script>

通常它在开发环境中是一个空字符串,在生产环境中是 cdn url。我想避免将此 STATIC_URL 变量传递给每个 View 。我可以让它与

@bp.context_processor
def set_static_path():
return dict(STATIC_URL='https://foo.bar.com')

但对我来说这似乎有点老套。有没有更好的方法来解决这个问题?

最佳答案

无需更改链接到静态文件的方式,您仍然可以使用 url_for('static', filename='myfile.txt')。将默认静态 View 替换为重定向到 CDN(如果已配置)的 View 。

from urllib.parse import urljoin
# or for python 2: from urlparse import urljoin
from flask import redirect

@app.endpoint('static')
def static(filename):
static_url = app.config.get('STATIC_URL')

if static_url:
return redirect(urljoin(static_url, filename))

return app.send_static_file(filename)

无论您是在开发机器上还是在生产机器上,将 STATIC_URL 配置值设置为 CDN,对静态文件的请求将被重定向到那里。


重定向相对便宜,并且会被浏览器记住。如果您到了性能受到它们显着影响的地步,您可以编写一个在使用 CDN 时直接链接的函数。

@app.template_global()
def static_url(filename):
static_url = app.config.get('STATIC_URL')

if static_url:
return urljoin(static_url, filename)

return url_for('static', filename=filename)

template_global 装饰器使该函数在所有模板中可用。当您需要静态文件的 url 时,请使用它而不是 url_for


可能已经有一个 Flask 扩展可以为您做到这一点。例如,Flask-S3提供一个 url_for 来提供来自 AWS S3 的静态文件。

关于python - 在生产中从 CDN 而不是 Flask 提供静态文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35824412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com