在 CherryPy 中包含"+"的 URL 出现问题



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

例如,考虑形式为/:category/:company的URL,其中类别为Food and Beverage,两个可能的公司名称为Eat / Drink / Be MerryJane+Janet

我用将这些呈现到我的HTML中

'/{}/{}'.format(
urllib.quote_plus(self.category.encode('utf8')),
urllib.quote_plus(self.company_name.encode('utf8'))
)

然后,在CherryPy中,我使用/:category/:company_name等路由接收类别和公司名称,并对公司名称执行以下处理:

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

这适用于没有受URL编码的字符的公司名称,也适用于具有大多数URL编码所需字符的公司名(例如,Eat / Drink / Be Merry没有问题)。但是,如果我原来的公司名称中有一个+签名,它就不起作用了。CherryPy似乎已经为我完成了部分解码(用+替换%2B),因此当我应用自己的解码时,+会被一个空格替换。

以下是Eat / Drink / Be Merry的四个print语句的结果:

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"条目。

如何避免+符号的双重解码?

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

如果你真的想获得rawURI,cherrypy在wsgi环境中有一个非标准的REQUEST_URI密钥,你可以用:cherrypy.request.wsgi_environ['REQUEST_URI']来获得。

但实际上,你应该只使用cherrypy直接发送给你的params,编码/解码是通过HTTP传输数据的一部分,这不应该与你的应用程序逻辑有关。

最新更新