gpt4 book ai didi

python - Flask URL路由编码问题

转载 作者:行者123 更新时间:2023-12-05 06:58:36 33 4
gpt4 key购买 nike

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

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

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 编码的配置选项。

我在该主机上有以下 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"

没有任何iso-8859-1。它从哪里来?

最佳答案

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

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

在此处查看从 session 2.1 到 2.5 的官方 URL 规范: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 数据的影响,否则您的应用程序将失败。 (只需在调用 .decode 时添加一个 errors="replace" 参数即可)

关于python - Flask URL路由编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64576519/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com