【发布时间】:2017-02-01 14:57:44
【问题描述】:
我有一个应用程序,其中必须使用 URL 中的加号构建 URL(因为这些是实际公司的名称)。我在将链接写入我的 HTML 时遇到了一些问题,这些链接可以被 CherryPy 正确接收和处理。我认为问题在于,仅在 + 符号的情况下,CherryPy 和我的代码都试图解码传入 HTML 中的 %2B ,以便它首先转换(正确)为 + 然后 进一步(错误地)转换为空格。
例如,考虑格式为 /:category/:company 的 URL,其中类别为 Food and Beverage,两个可能的公司名称为 Eat / Drink / Be Merry 和 Jane+Janet。
我使用
将这些渲染到我的 HTML 中 '/{}/{}'.format(
urllib.quote_plus(self.category.encode('utf8')),
urllib.quote_plus(self.company_name.encode('utf8'))
)
然后,在 CherryPy 中,我使用 /:category/:company_name 之类的路由接收类别和 company_name,并对 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”条目。
如何避免+ 符号的这种双重解码?
【问题讨论】:
标签: python url cherrypy url-encoding