Flask Docker应用部署报TypeError,请求排查Werkzeug版本兼容问题
Flask + Werkzeug 3.0.0 兼容性报错解决方法
问题背景
基于Docker的Flask Web应用,使用相同Dockerfile和requirements.txt重新构建后出现报错,此前运行正常。当前环境为Python 3.12.0,Werkzeug版本3.0.0,报错核心为字符串正则匹配字节对象的类型错误。
报错堆栈
Traceback (most recent call last): File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 2213, in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 2193, in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 2190, in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 1487, in full_dispatch_request return self.finalize_request(rv) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 1508, in finalize_request response = self.process_response(response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 2005, in process_response self.session_interface.save_session(self, ctx.session, response) File "/usr/local/lib/python3.12/site-packages/flask_session/sessions.py", line 454, in save_session response.set_cookie(app.config["SESSION_COOKIE_NAME"], session_id, File "/usr/local/lib/python3.12/site-packages/werkzeug/sansio/response.py", line 224, in set_cookie dump_cookie( File "/usr/local/lib/python3.12/site-packages/werkzeug/http.py", line 1303, in dump_cookie if not _cookie_no_quote_re.fullmatch(value): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: cannot use a string pattern on a bytes-like object
解决方法
方法1:锁定Werkzeug版本到2.x
Werkzeug 3.0.0对Cookie值的类型校验更严格,而旧版flask-session未适配该变化。在requirements.txt中添加版本限制:
Werkzeug<3.0
重新构建Docker镜像,确保安装的Werkzeug为2.x系列版本。
方法2:升级flask-session到兼容版本
检查并升级flask-session至支持Werkzeug 3.0+的最新版本:
pip install --upgrade flask-session
更新requirements.txt中的flask-session版本,再重新构建镜像。
方法3:临时代码修复(不推荐)
若无法修改依赖版本,可临时修改flask_session/sessions.py的save_session方法,将session_id转为字符串类型:
找到调用response.set_cookie的行,将session_id改为str(session_id)。但此方法仅临时生效,下次构建镜像会被覆盖,优先使用前两种方法。
内容的提问来源于stack exchange,提问作者Allan K
相关产品推荐
相关产品推荐

