当前位置: 首页 > 面试题库 >

在生产中从CDN而非Flask服务静态文件

能帅
2023-03-14
问题内容

在我的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_URLconfig值设置为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 ,您还需要具有一个实例。在静态上下文(主要方法)中,没有要引用的实例。因此,编