- 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'",
],