Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 烧瓶URL路由编码问题_Python_Python 3.x_Flask_Unicode_Werkzeug - Fatal编程技术网

Python 烧瓶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

我偶然发现了一个奇怪的名字 烧瓶中的URL编码问题

@app.route("/it2/<string:name>")
def render_it2(name=""):
    name = _fix_encoding(name)
    return _render_file("it2", name)
我知道这是肮脏的黑客行为, 这就是为什么我想问Flask/Werkzeug大师, 我的设置有什么问题?为了让URL已经在UTF-8中解码,我应该做些什么改变,这样就不需要这种丑陋的重新编码了

有很多类似的问题/答案,但没有真正有帮助的回答,例如:

我认为应该有一些环境变量,或者一些影响默认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头上,其中“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"