我有一个应用程序,其中必须使用 URL 中的加号构建 URL(因为这些是实际公司的名称)。我在将链接写入 HTML 时遇到一些问题,而 CherryPy 可以正确接收和处理这些链接。我相信问题在于,仅在 +
符号的情况下,CherryPy 和我的代码都试图解码传入 HTML 中的 %2B,以便它首先(正确)转换为 +
,然后进一步转换(错误地)为空格。
例如,考虑/:category/:company 形式的 URL,其中类别为 Food and Beverage
,两个可能的公司名称为 Eat/Drink/Be Merry
和简+珍妮特
。
我使用
将这些渲染到我的 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”条目。
如何避免 +
符号的双重解码?
最佳答案
url 的解码(百分比编码)是 http 服务器的一个组成部分,您不必拥有自己的 urllib.unquote_plus
。
如果您确实想获取原始 URI,cherrypy 在 wsgi 环境中有一个非标准 REQUEST_URI
键,您可以通过以下方式获取:cherrypy .request.wsgi_environ['REQUEST_URI']
。
但实际上,你应该只使用cherrypy直接发送给你的参数,编码/解码是HTTP数据传输的一部分,它不应该关心你的应用程序逻辑。
关于python - CherryPy 中包含 "+"的 URL 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41982846/