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

标签 python url cherrypy url-encoding

我有一个应用程序,其中必须使用 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/

相关文章:

python - 在 Cherrypy 中运行多个类

python - 强制 CherryPy 子线程

python - 构建一个将列表转换为字典并根据条件分配键值的函数

python - 值错误 : zero-size array to reduction operation maximum

java - 如何使用 Java 从网站检索 URL?

python - 如何将cherrypy.session()存储在变量中?

python - 没有名为 'sklearn.neighbors._base' 的模块

python - 使用 IO 库将字符串变量作为 txt 文件加载到 s3 或从 s3 加载

javascript - 使用 php/js 检索 IMDB 海报图片

python - 如何将变量传递给 django 中的 {% url %} 标签?