NiceLeeのBlog 用爱发电 bilibili~

Python 一个依赖库版本更新导致的问题

2022-05-16
nIceLee

阅读:


在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到最新版本有了破环性的更新。
接下来的依赖MarkupSafeitsdangerous也是同理。

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

内容
隐藏