You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,无效。
  • 修改请求字符集:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:34:59