Python 烧瓶URL路由编码问题
我偶然发现了一个奇怪的名字 烧瓶中的URL编码问题Python 烧瓶URL路由编码问题,python,python-3.x,flask,unicode,werkzeug,Python,Python 3.x,Flask,Unicode,Werkzeug,我偶然发现了一个奇怪的名字 烧瓶中的URL编码问题 @app.route("/it2/<string:name>") def render_it2(name=""): name = _fix_encoding(name) return _render_file("it2", name) 我知道这是肮脏的黑客行为, 这就是为什么我想问Flask/Werkzeug大师, 我的设置有什么问题?为了让URL已经在U
@app.route("/it2/<string:name>")
def render_it2(name=""):
name = _fix_encoding(name)
return _render_file("it2", name)
我知道这是肮脏的黑客行为,
这就是为什么我想问Flask/Werkzeug大师,
我的设置有什么问题?为了让URL已经在UTF-8中解码,我应该做些什么改变,这样就不需要这种丑陋的重新编码了
有很多类似的问题/答案,但没有真正有帮助的回答,例如:
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头上,其中“name”已经是utf-8编码的,但是框架的HTTP端被告知它是latin1。你看不到那么多,因为URL通常用“%HH”转义,其中“HH”是UTF-8序列中的字节。如果可以,请更改url的源代码以正确转义它们(在Python中,对url的调用是urllib.parse.quote(url)
)
检查官方URL规范,从会话2.1到2.5,请点击此处:
显然,没有标准的方法来告诉HTTP服务器组件(在Python端,WSGI层和Flask本身),这是URL本身的文本编码——这些组件假定utf-8数据使用的ASCII集之外的字节为拉丁语-1(也称为iso-8859-1)
最后,如果在源代码处引用URL不是一个选项,那么您的方法就足够好了。您可能会更好地保护您的
\u fix\u encoding
函数,防止格式错误的utf-8数据,否则您的应用程序将失败。(只需在调用.decode
时添加errors=“replace”
参数即可)生成URL中使用的“名称”的代码在哪里?就这部分代码而言,“名称”只是一个输入:它是在其他地方用不正确的编码创建的。@jsbueno我真的不明白你们的问题。你是什么意思?这是一种单线烧瓶应用<代码>导入烧瓶这个功能,就是整个代码谢谢你的回答,简而言之,它的意思是:“没关系,用它生活”。至少从这个角度来看,我不觉得自己太傻是有帮助的,因为我错过了一些显而易见的事情。但我仍然希望,必须有一些真正的解决办法。至少,它以前工作正常(基于Python2.x)。在现实生活中,无论如何都会有一个web前端服务器,它能够根据我们的需要对URL进行编码,但我想知道如何配置Flask,以便它自己正确地处理URL Python 2.x的区别在于Flask将以字节字符串处理视图:您的视图将选择如何解码它。现在,Flask AHA为您提供了一个文本字符串:它必须首先对其进行解码——但是在规范中没有办法声明URL的编码,Flask+WSGI采用拉丁语-1。这种编码的优点是“无损”:URL中的所有字节都将成为0-256范围内的unicode字符。执行您所做的操作可以将其更改回正确的编码。也许有一些配置可以更改为以字节形式传递url,而不尝试解码。是的,我同意配置,实际上这是我最初的问题
$ 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"