Flask URL路由编码问题

2024-03-27

我偶然发现了一个奇怪的 Unicode Flask 中的 URL 编码问题。

@app.route("/it2/<string:name>")
def render_it2(name=""):
    name = _fix_encoding(name)
    return _render_file("it2", name)

When name包含 Unicode 字符, 它们被解码为iso-8859-1代替utf-8.

所以我必须添加_fix_encoding功能:

def _fix_encoding(string):
    return string.encode('iso-8859-1').decode('utf8')

我知道这是肮脏的黑客, 这就是为什么我想问 Flask/Werkzeug 大师, 我的设置有什么问题吗?为了让 URL 已经以 UTF-8 解码,我应该更改什么,这样就不需要这种丑陋的重新编码?

SO 有很多类似的问题/答案,但没有真正有用的答案,例如:

  • 如何在 Flask python 中路由非 ascii URL https://stackoverflow.com/questions/49847076/how-to-route-non-ascii-urls-in-flask-python

我想应该有一些环境变量,或者一些影响默认 Flask 编码的配置选项。

我有以下内容LANG/LC_*在该主机上:

$ echo $LANG
en_US.UTF-8

$ export | grep LC
declare -x LC_ADDRESS="en_US.UTF-8"
declare -x LC_IDENTIFICATION="en_US.UTF-8"
declare -x LC_MEASUREMENT="en_US.UTF-8"
declare -x LC_MONETARY="en_US.UTF-8"
declare -x LC_NAME="en_US.UTF-8"
declare -x LC_NUMERIC="en_US.UTF-8"
declare -x LC_PAPER="en_US.UTF-8"
declare -x LC_TELEPHONE="en_US.UTF-8"
declare -x LC_TIME="en_US.UTF-8"

No iso-8859-1任何。它从何而来?


哪个应用程序/代码/网页创建了嵌入“名称”的 URL?

在生成的 HTTP 标头中,“name”已经是 utf-8 编码,但框架的 HTTP 端被告知它是 latin1。您看不到那么多,因为通常 URL 使用“%HH”进行转义 - 其中“HH”是 UTF-8 序列中的字节。如果可以的话,更改 URL 的来源以正确转义它们(在 Python 中,对此的调用将是urllib.parse.quote(url)).

在此处查看官方 URL 规范,从会话 2.1 到 2.5:https://www.rfc-editor.org/rfc/rfc3986#section-2.1 https://www.rfc-editor.org/rfc/rfc3986#section-2.1

显然,没有标准方法来告诉 HTTP 服务器组件(在 Python 端、WSGI 层和 Flask 本身)哪个是 URL 本身的文本编码 - 并且这些组件假设为 Latin-1(又名 iso-8859-) 1) 对于 utf-8 数据使用的 ASCII 集之外的字节。

最后 - 如果不能选择在源中引用 URL,那么您的方法就足够了。你可能会更好地保护你的_fix_encoding函数针对格式错误的 utf-8 数据,否则您的应用程序将失败。 (只需添加一个errors="replace"调用中的参数.decode会做)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flask URL路由编码问题 的相关文章

随机推荐