【问题标题】:flask templates: nginx cache or serve static assets called in jinja markups烧瓶模板:nginx 缓存或提供在 jinja 标记中调用的静态资产
【发布时间】:2016-03-25 04:10:24
【问题描述】:

我想更好地理解 flask 如何在 ningx 后面为 jinja 模板提供服务的逻辑

我的目标是优化加载时间,通过缓存或使 ningx 服务于 JS、CSS 以及可能的 片段 html 的模板 不是动态的

根据评论更新

如何测试 Ningx 和 Flask 之间的哪个服务为 jinja 标记为 src="{{ url_for('static', filename='static/js/pageScript.js'}} 的 html 模板中调用的静态资产提供服务?

我想尽可能将静态资产委托给 Nginx, 并且我想通过以下配置了解哪个功能。

例如,从page.html模板调用的所有JS、CSS对于路由/path/的所有<int:ids>都是一样的:

@application.route('/path/<int:id>/')
def graph_template(id):
    meta = {'og:title':'the title of my page is about element ID'}
    return render_template('page.html', meta=meta)

唯一的动态部分是&lt;meta&gt;片段,但在模板中我将调用JS和CSS:

&lt;script type="text/javascript" src="{{ url_for('static', filename='static/js/pageScript.js') }}"&gt;&lt;/script&gt;?

  • flask 是否提供整个最终的 html 模板,包括 js 和 css ? 或
  • flask 是否只服务于 html 页面,而 js 和 css 由 nginx 服务? 或
  • 或者甚至可以让flask服务一部分html,让nginx服务完整的html页面和资产?
  • 如何缓存动态 jinja 模板中常见的 js 和 css 元素?

在另一个问题中: [Flask: Caching static files (.js, .css) 建议使用 nginx 服务静态元素,但这里我有通过 jinja 标记 调用的 dynamic 元素,我不清楚哪个服务正在处理什么。


我的 nginx 配置使用这些块来路由 /static/ 和 /path/:

location /static {
alias /var/www/mySite/static;
}

location /path/ {
   include uwsgi_params;
   uwsgi_pass unix:/var/www/mySite/myApp.sock;
}

Page.html 模板中用于调用资产的 Jijnja 标记:

<script type="text/javascript"  src="{{ url_for('static', filename='static/js/pageScript.js') }}"></script>

渲染:src=/static/js/pageScript.js

flask 应用的结构是:

/app.py
/templates/page.html
/static/js/pageScript.js

【问题讨论】:

    标签: python caching nginx flask jinja2


    【解决方案1】:

    查看实际服务内容的最简单方法是向每个可能服务的元素添加自定义标头,然后跟踪哪个标头( ) 被返回:

    # In your application setup code:
    @app.after_request
    def add_served_by_flask_header(response):
        response.headers["X-Served-By-Flask"] = "true"
        return response
    

    在你的 nginx 配置中:

    location /static {
        alias /var/www/mySite/static;
        add_header X-Served-By-NGINX true always;
    }
    

    也就是说,看起来你应该看到你的标记是由 Flask 提供的,但你的静态文件将由 nginx 提供。 Flask 动态生成标记,但是当浏览器去下载 HTML 指向的文件时,nginx 会处理它而不需要调用 Flask。

    【讨论】:

      猜你喜欢
      • 2012-09-02
      • 2018-02-23
      • 1970-01-01
      • 2021-01-22
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 2019-05-29
      相关资源
      最近更新 更多