在我的Flask应用程序中,我通过开发环境中的应用程序提供静态资产,但是我想在生产中使用CDN。每个资产都加载到名为的模板中base.hmtl
,因此我想最简单的解决方案是将变量传递给render函数,并在模板中使用它,例如:
<script src="{{ STATIC_URL }}/js/main.js"></script>
通常,在dev env中它将是一个空字符串,而在生产环境中将是cdn url。我想避免将此STATIC_URL
变量传递给每个视图。我可以使它与
@bp.context_processor
def set_static_path():
return dict(STATIC_URL='https://foo.bar.com')
但是对我来说,这似乎有点不客气。有解决这个问题的更好方法吗?
无需更改链接到静态文件的方式,仍然可以使用url_for('static', filename='myfile.txt')
。将默认静态视图替换为重定向到CDN(如果已配置)的视图。
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
config值设置为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_for
需要静态文件的URL时使用它。
可能已经有一个Flask扩展程序可以为您执行此操作。例如,Flask-S3提供了一个服务url_for
,用于提供来自AWS
S3的静态文件。
我们先来看看最简单的本地静态文件服务配置示例: server { listen 80; server_name www.test.com; charset utf-8; root /data/www.test.com; index index.html index.htm; } 就这些?
Web应用程序通常需要一个静态文件,例如支持显示网页的JavaScript文件或CSS文件。 通常,可以通过配置Web服务器提供这些服务,但在开发过程中,这些文件将从包中的静态文件夹或模块旁边提供,它将在应用程序的上提供。 使用特殊的端点“静态”来为静态文件生成URL。 在以下示例中,中的HTML按钮的事件调用中定义的javascript函数,该函数在Flask应用程序的URL => 中呈现。 i
我试着设置nginx来服务我的node.js应用程序静态文件。问题是,当我试图得到我的文件时,我的状态是403禁止的。 当我尝试下载一个文件从 /root/appJs/public/css/style.css我写http://sitename.com/css/style.css我retive 403禁忌状态。我已经在一些论坛上寻找解决方案,但没有
问题内容: 我想定义一个包含三个变量组件的url规则,例如: 但是我发现开发服务器在尝试匹配静态文件之前会评估这些规则。所以像这样: 会被我的url规则捕获,而不是转发给内置的静态文件处理程序。有没有一种方法可以强制开发服务器首先匹配静态文件? PS仅当规则具有两个以上可变组成部分时,这才是问题。 问题答案: 这是werkzeug路线优化功能。见,并且: 有-当前参数-路径深度。 因为我们有。有-
问题内容: 所以这很尴尬。我有一个应用程序,该应用程序已集成在一起,现在它只提供一个静态HTML页面,其中包含指向CSS和JS的链接。而且我找不到文档中描述返回静态文件的位置。是的,我可以使用,但是我知道数据没有模板化。我还以为或者是正确的事情,但我不能让这些工作。同时,我正在打开文件,阅读内容,并装配Response具有适当mimetype的: 有人要为此提供代码示例或网址吗?我知道这将变得简单
问题内容: 这个问题已经在这里有了答案 : 7年前关闭。 可能重复: 为什么我会得到“无法从静态上下文引用的非静态变量”? 这是代码 错误说: 非静态类 Node 不能从静态上下文中引用 为什么不应该在main()方法中引用Node类? 问题答案: Java中的非静态嵌套类包含对父类 实例 的隐式引用。因此,要实例化a ,您还需要具有一个实例。在静态上下文(主要方法)中,没有要引用的实例。因此,编