- ImportError: cannot import name ‘Markup’ from ‘jinja2’
- ImportError: cannot import name ‘soft_unicode’ from ‘markupsafe’
- ImportError: cannot import name ‘json’ from ‘itsdangerous’
- 总结
在Vercel上部署了一些东西,最近因为某功能失效,小小的修复了一下,改动不过十余行,结果部署后整个都down了。
这就很烦。
ImportError: cannot import name ‘Markup’ from ‘jinja2’
这是由于flask版本较旧,而它所依赖的Jinja2有了破坏性的更新,二者不兼容导致的。
要么两者都使用最新版,要么都是用老版本。
由于项目本身的代码有部分不兼容新版本的flask,故而只能考虑后者。
于是修改requirements.txt
flask==1.0.2
...
变为
flask==1.0.2
Jinja2==2.11.2
...
ImportError: cannot import name ‘soft_unicode’ from ‘markupsafe’
同理
flask==1.0.2
Jinja2==2.11.2
...
变为
flask==1.0.2
Jinja2==2.11.2
MarkupSafe==1.1.1
...
ImportError: cannot import name ‘json’ from ‘itsdangerous’
同理
flask==1.0.2
Jinja2==2.11.2
MarkupSafe==1.1.1
...
变为
flask==1.0.2
Jinja2==2.11.2
MarkupSafe==1.1.1
itsdangerous==1.1.0
...
总结
看了一下flask的依赖,基本上都是用的大于等于号,
如果部署环境的时候,不在requirements.txt
里指定版本的话,
那么默认会是最新版本。
很明显,源码能够工作的环境依赖Jinja2
到最新版本有了破环性的更新。
接下来的依赖MarkupSafe
、itsdangerous
也是同理。
#https://kgithub.com/pallets/flask/blob/1.0.x/setup.py
install_requires=[
'Werkzeug>=0.14',
'Jinja2>=2.4',
'itsdangerous>=0.21',
'click>=2.0',
],
#https://kgithub.com/pallets/flask/blob/2.1.x/setup.py
install_requires=[
"Werkzeug >= 2.0",
"Jinja2 >= 3.0",
"itsdangerous >= 2.0",
"click >= 8.0",
"importlib-metadata >= 3.6.0; python_version < '3.10'",
],