【问题标题】:Trouble with URL containing "+" in CherryPyCherryPy 中包含“+”的 URL 出现问题
【发布时间】:2017-02-01 14:57:44
【问题描述】:

我有一个应用程序,其中必须使用 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 之类的路由接收类别和 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


    【解决方案1】:

    url的解码(百分比编码)是http服务器的一个组成部分,你不应该自己做urllib.unquote_plus

    如果你真的想得到 raw URI,cherrypy 在 wsgi 环境中有一个非标准的 REQUEST_URI 键,你可以通过:cherrypy.request.wsgi_environ['REQUEST_URI'] 得到它。

    但实际上,您应该只使用cherrypy直接发送给您的参数,编码/解码是通过HTTP传输数据的一部分,它不应该涉及您的应用程序逻辑。

    【讨论】:

    • 但如果是这样,为什么我的函数收到第一家公司没有解码?
    • 您使用的是哪个版本的 Python 和 CherryPy?另外,您使用的是哪个调度程序?默认的? Routes 还是 MethodDispatcher/Eat / Drink uri 对我有用,但也许我没有完全理解你的问题。
    • Python 2.7,CherryPy 3.7.0,使用路由调度。当我收到方法中的参数时,%2B 已经为我解码,但 %20 和 %2F 没有。
    • @LarryLustig AFAIU 你只希望%2B 在到达处理程序时被表示为+。它看起来像 unquote_plus 在您的情况下被 urldecode 之后发生(但应该在此之前发生)。您能否使用最新版本的 CherryPy 重现此内容。它可能已被修复。
    • P.S.这可能发生在routes 包中,它与 CherryPy 是分开的,因此也应该检查这一点。也许你只需要升级它。
    猜你喜欢
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 2014-02-12
    • 2011-10-25
    • 1970-01-01
    相关资源
    最近更新 更多