部署在Gunicorn的Flask应用模板与静态文件热重载失败问题
解决Gunicorn无法监听Flask模板/静态文件变更的问题
问题描述
- 将Python Flask应用部署在Kubernetes环境,通过Procfile完成构建与部署
- 修改Python文件(.py)可正常触发Gunicorn重载,但模板文件(.html)和静态文件(.css)修改后无法触发重载
- 已确认修改后的文件已同步到容器的
/workspace目录,但仅修改静态或模板文件时,Gunicorn不会重启工作线程
项目结构
. ├── Procfile ├── README.md ├── Tiltfile ├── board │ ├── __init__.py │ ├── pages.py │ ├── postgresql.py │ ├── posts.py │ ├── schema-postgres.sql │ ├── static │ └── templates ├── gunicorn_config.py ├── requirements.txt ├── venv │ ├── bin │ ├── include │ ├── lib │ └── pyvenv.cfg └── wsgi.py
当前配置
gunicorn_config.py
workers = 1 loglevel = 'info' reload = True reload_extra_file = ['/workspace/board/templates/*.html', '/workspace/board/static/*.css'] errorlog = '-' accesslog = '-' threads = 2 worker_class = 'gthread'
wsgi.py
from board import create_app app = create_app() if __name__ == '__main__': app.run()
Procfile
web: gunicorn -b :8080 wsgi:app --config gunicorn_config.py
解决方案
修正
reload_extra_file路径配置:Gunicorn的reload_extra_file不支持通配符(如*.html),需指定具体文件或目录路径。将配置改为监听整个目录,这样能覆盖所有模板和静态文件的变更:reload_extra_file = ['/workspace/board/templates', '/workspace/board/static']升级Gunicorn版本:部分旧版本Gunicorn对目录监听的支持存在缺陷,建议升级到20.1.0及以上稳定版,可在
requirements.txt中指定:gunicorn>=20.1.0验证文件变更事件传递:在容器内手动修改模板文件后,通过
kubectl logs <pod-name>查看Gunicorn日志,确认是否出现"Worker reloading due to file change"的日志,同时确保Gunicorn进程对目标目录有读写权限。开启Flask模板自动重载:若无需重启Gunicorn,仅需刷新模板,可在Flask应用的
create_app函数中添加配置:app.config['TEMPLATES_AUTO_RELOAD'] = True该配置会让Flask在每次请求时重新加载模板,适合开发场景。
内容的提问来源于stack exchange,提问作者Nataraj Basappa
相关产品推荐
相关产品推荐

