包含" +"的网址出现问题在CherryPy

时间:2017-02-01 14:57:44

标签: python url cherrypy url-encoding

我有一个应用程序,其中必须使用URL中的加号构建URL(因为这些是实际公司的名称)。我在编写可以被CherryPy正确接收和处理的HTML链接时遇到一些麻烦。我认为问题在于,仅在+符号的情况下,CherryPy和我的代码都试图解码传入HTML中的%2B,以便它首先(正确地)转换为{ {1}}然后进一步转换(错误地)到空格。

例如,请考虑表单为/:category /:公司的网址,其中类别为+,两个可能的公司名称为Food and BeverageEat / 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 符号的双重解码?

1 个答案:

答案 0 :(得分:0)

网址解码(百分比编码)是http服务器不可或缺的一部分,你不应该拥有urllib.unquote_plus

如果你真的想获得 raw URI,那么在wsgi环境中,cherrypy有一个非标准的REQUEST_URI密钥,你可以使用:cherrypy.request.wsgi_environ['REQUEST_URI']。< / p>

但实际上,你应该只使用cherrypy直接寄给你的参数,编码/解码是HTTP传输数据的一部分,它不应该与你的应用逻辑有关。