Flask/Werkzeug在AWS Lambda中URL UnicodeEncodeError问题求助
Flask路由Unicode字符在AWS Lambda上的编码错误问题
我在Stack Overflow等平台查过很多相关问题,但都解决不了我的问题,所以详细说明我的场景:
我有如下Flask路由:
@bp.route("/experiment/<name>", methods=["GET"])
我希望name部分支持Unicode字符,比如’(弯引号),例如name="bob’s house"。访问该URL时,触发错误:
UnicodeEncodeError: 'latin-1' codec can't encode character '’' in position ...: ordinal not in range(256)
回溯信息最后一行:
File "/var/lang/lib/python3.10/site-packages/werkzeug/_internal.py", line 119, in _wsgi_decoding_dance return s.encode("latin1").decode(charset, errors)
本地运行Flask服务器无此错误,但部署到AWS Lambda时触发。本地通过poetry run python src/webapp/app.py启动,AWS端运行在Docker容器中,镜像为public.ecr.aws/lambda/python:3.10-x86_64(不确定是否相关),环境变量无差异。
已尝试的解决方案(均无效)
- URL解析工具:有人建议用
urllib.unquote(param)等解析URL,但错误在自定义代码执行前触发,比如下面的print语句根本不会执行:
@bp.route("/experiment/<name>", methods=["GET"]) def render(name): print(f"name: {name}")
- 修改路由定义:尝试指定
name类型和字符串格式,比如:
@bp.route(u"/experiment/<string:name>", methods=["GET"])
也试过<path:name>,问题依旧。
环境变量配置:
- 在AWS Lambda环境变量中设置
PYTHONUTF8=1,无效; - Dockerfile中添加
ENTRYPOINT ["python3", "-X utf8", "src/webapp/app.py"],无效; - Dockerfile中添加
ENV PYTHONIOENCODING=utf-8,无效。
- 在AWS Lambda环境变量中设置
修改请求字符集:在
config.py中添加:
environ.update(HTTP_ACCEPT_CHARSET="ISO-8859-1,utf-8;q=0.7,*;q=0.7")
仍然无效。
疑问与需求
我知道ASCII是HTTP标准字符集,也了解百分编码的概念。name = bob's house(直引号)时没问题,不明白为什么空格能正常处理,但’会触发错误。我不想改用直引号,希望能自由使用弯引号这类Unicode字符。
我懂Python相关的编码问题,但不清楚如何在WSGI/Werkzeug/Flask/Lambda的流程中解决这个问题。
进一步尝试(仍无效)
尝试在请求前修改路径编码,但错误在该函数执行前触发,只有URL正常时才会调用这个函数:
from lambdarado import start from urllib.parse import quote from flask import request def get_app(): # 返回WSGI应用,比如Flask from webapp import create_app app = create_app() @app.before_request def encode_path_info(): print("got call to encode_path_info") print(request.path) print(quote(request.path)) # 用UTF-8正确编码path_info path = quote(request.path) request.path = path return app my_app = get_app start(my_app)
内容的提问来源于stack exchange,提问作者louisdeb
相关产品推荐
相关产品推荐

