Flaskを使ってAPIサーバーを書いていたら、開発環境を更新したタイミングでサーバー起動時にurl_quote
が見つからないというエラーが出るようになってしまった。
Traceback (most recent call last):
File "/usr/local/bin/flask", line 5, in <module>
from flask.cli import main
File "/usr/local/lib/python3.9/site-packages/flask/__init__.py", line 5, in <module>
from .app import Flask as Flask
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 30, in <module>
from werkzeug.urls import url_quote
ImportError: cannot import name 'url_quote' from 'werkzeug.urls' (/usr/local/lib/python3.9/site-packages/werkzeug/urls.py)
原因
Werkzeugのアップデートによるurl_quoteの廃止
2023年9月30日に、Flaskが参照しているWerkzeugというライブラリのメジャーアップデートがあり3.0.0がリリースされた。
Werkzeug 3.0.0でurl_quote
が廃止されたが、Flaskの古いバージョンはこのメソッドを参照している。
Flask側でのWerkzeugのバージョン指定の問題
古いバージョンのFlaskではWerkzeugのバージョンが細かく指定されていなかったため、破壊的変更を含むWerkzeug 3.0.0
がリリースされたタイミング以降にDependencyを解決しようとすると、Werkzeug 3.0.0
がインストールされるような形になってしまった。
"Werkzeug >= 2.2.2",
回避方法
Flaskのバージョンを上げる
Flask 2.3.3
以降では、使用するWerkzergのバージョンが明示的に指定されているため問題が起きない。なので、使用するFlaskを2.3.3
以降のバージョンにバージョンアップする。
Flask==2.3.3
Werkzeugのバージョンを明示的に指定する
なんらかの理由でFlaskのバージョンアップができない場合は、requirements.txt
などでWerkzeug 2.x系を使用するように明示的に指定する。
Werkzeug==2.3.7