我有一个应用程序,其中必须使用URL中的加号构建URL(因为这些是实际公司的名称)。我在编写可以被CherryPy正确接收和处理的HTML链接时遇到一些麻烦。我认为问题在于,仅在+
符号的情况下,CherryPy和我的代码都试图解码传入HTML中的%2B,以便它首先(正确地)转换为{ {1}}然后进一步转换(错误地)到空格。
例如,请考虑表单为/:category /:公司的网址,其中类别为+
,两个可能的公司名称为Food and Beverage
和Eat / Drink / Be Merry
。
我用
将这些渲染到我的HTML中Jane+Janet
然后,在CherryPy中,我使用 '/{}/{}'.format(
urllib.quote_plus(self.category.encode('utf8')),
urllib.quote_plus(self.company_name.encode('utf8'))
)
等路由接收类别和company_name,并对company_name执行以下处理:
/:category/:company_name
这适用于没有受URL编码限制的字符的公司名称,并且适用于具有大多数URL编码所需字符的公司名称(例如,def Company(category, company_name):
print company_name
company_name = company_name.encode('utf-8')
print company_name
company_name = urllib.unquote_plus(company_name)
print company_name
company_name = company_name.decode('utf-8')
print company_name
没有问题)。但是,如果我原来的公司名称中有一个Eat / Drink / Be Merry
标志,则它不起作用。似乎CherryPy已经为我完成了解码的部分(用+
替换%2B
),这样当我应用自己的解码时,+
是用空格代替。
以下是+
的四个print
语句的结果:
Eat / Drink / Be Merry
和Eat%20%2F%20Drink%20%2F%20Be%20Merry
Eat%20%2F%20Drink%20%2F%20Be%20Merry
Eat / Drink / Be Merry
Eat / Drink / Be Merry
:
Jane+Janet
我的申请在这一点上失败了,因为没有" Jane Janet"在数据库中输入以进行更新。
如何避免Jane+Janet
Jane+Janet
Jane Janet
Jane Janet
符号的双重解码?
答案 0 :(得分:0)
网址解码(百分比编码)是http服务器不可或缺的一部分,你不应该拥有urllib.unquote_plus
。
如果你真的想获得 raw URI,那么在wsgi环境中,cherrypy有一个非标准的REQUEST_URI
密钥,你可以使用:cherrypy.request.wsgi_environ['REQUEST_URI']
。< / p>
但实际上,你应该只使用cherrypy直接寄给你的参数,编码/解码是HTTP传输数据的一部分,它不应该与你的应用逻辑有关。