【问题标题】:Timeout due to flask-assets pipeline when debug is turned off关闭调试时由于烧瓶资产管道超时
【发布时间】:2018-04-01 12:06:12
【问题描述】:

我有一个基于 Flask 的应用程序,它使用 flask-assets 来捆绑、编译和缩小 css 和 Javascript。当我使用 gunicorn 启动应用程序时发生超时

gunicorn --bind=0.0.0.0:8000 --workers=3 --log-level=INFO manage:app

超时消息指出:

[2018-04-01 11:15:13 +0000] [10] [INFO] Starting gunicorn 19.6.0
[2018-04-01 11:15:13 +0000] [10] [INFO] Listening at: http://0.0.0.0:8000 (10)
[2018-04-01 11:15:13 +0000] [10] [INFO] Using worker: sync
[2018-04-01 11:15:13 +0000] [16] [INFO] Booting worker with pid: 16
[2018-04-01 11:15:13 +0000] [17] [INFO] Booting worker with pid: 17
[2018-04-01 11:15:13 +0000] [18] [INFO] Booting worker with pid: 18
[2018-04-01 11:15:46 +0000] [10] [CRITICAL] WORKER TIMEOUT (pid:17)
[2018-04-01 11:15:47 +0000] [17] [INFO] Worker exiting (pid: 17)
[2018-04-01 11:15:47 +0000] [19] [INFO] Booting worker with pid: 19

我已在 assets.py 文件中定义了资产,其中包含内容

from flask_assets import Bundle

app_css = Bundle('app.scss', filters='libsass', output='styles/app.css')

app_js = Bundle('app.js', filters='jsmin', output='scripts/app.js')

vendor_css = Bundle(
    'vendor/semantic.css',
    filters='cssmin',
    output='styles/vendor.css')

vendor_js = Bundle(
    'vendor/jquery.min.js',
    'vendor/semantic.min.js',
    'vendor/tablesort.min.js',
    'vendor/zxcvbn.js',
    filters='jsmin',
    output='scripts/vendor.js')

主应用__init__.py中的相关部分是

from flask_assets import Environment

from .assets import app_css, app_js, vendor_css, vendor_js

def create_app(config_name):
    ...
    # Set up asset pipeline
    assets_env = Environment(app)
    dirs = ['assets/styles', 'assets/scripts']
    for path in dirs:
        assets_env.append_path(os.path.join(basedir, path))
    assets_env.url_expire = True

    assets_env.register('app_css', app_css)
    assets_env.register('app_js', app_js)
    assets_env.register('vendor_css', vendor_css)
    assets_env.register('vendor_js', vendor_js)

问题是,如何避免超时?是否可以在 gunicorn 开始等待之前预编译资产?

【问题讨论】:

    标签: python flask gunicorn flask-assets


    【解决方案1】:

    该解决方案需要进行两项更改,为 gunicorn 启用预加载在工厂中运行资产管道。要启用预加载,请将 --preload 添加到 gunicorn 命令:

    gunicorn --bind=0.0.0.0:8000 --workers=3 --preload --log-level=INFO manage:app
    

    如果没有另外指定,资产管道将以惰性方式运行,即,当请求首次需要其资产时。这意味着如果build() 没有被显式调用,第一个请求将阻塞并且可能超时。因此,对于create_app函数中的每个Bundle对象调用包:

    app_css.build()
    app_js.build()
    vendor_css.build()
    vendor_js.build()
    

    如果仅在 gunicorn 中启用了预加载或之前未明确构建的 Bundle,则使用第一个请求调用构建命令,然后超时。

    奖励:要加快 Travis CI 构建速度,请将 app/static/.webassets-cache 添加到 .travis.yml 的缓存中:

    cache:
      pip: true
      directories:
        - core/app/static/.webassets-cache
    

    【讨论】:

      猜你喜欢
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多