【问题标题】:How to ignore repeated slashes in Pyramid如何忽略金字塔中的重复斜线
【发布时间】:2014-09-15 19:03:54
【问题描述】:

我想确保以下两个 url 以相同的方式处理(有一个现有的客户端以这种方式发送请求):

/resource
//resource

很遗憾,我无法将两个 url 添加到同一路由,即使我尝试使用 //resource 格式,url 匹配在这种情况下也无法正常工作。

有什么办法可以解决这个问题,这样我就不必在 WSGI 前面的服务器中重写请求了?

编辑:我确实找到了允许我访问 NewRequest 事件的pyramid.event,所以我想我可以重写路径,但是由于有许多不同的函数以各种方式获取路径,我不确定如何我到底应该在现有请求中重写它。

edit2:整个事件似乎不再有关于//resource 的信息——我查询的任何元素都没有显示它。一切都声称我只收到了/ 的请求。

edit3:它似乎实际上与粘贴或介于两者之间的其他模块有关,而不是 Pyramid 本身 - uwsgi 使用双斜杠传递原始 path_info 没有任何问题。

【问题讨论】:

  • 这里只是一个想法。您可以创建一个中间件,在将 PATH_INFO 变量传递给金字塔之前对其进行修改
  • 顺便说一句,您似乎在女服务员中发现了一个错误。双斜杠显然去除了第一个路径部分 //something/fun 被转换为 /fun,虽然使用三斜杠给了我正确的结果

标签: python url-routing pyramid


【解决方案1】:
import re

class RemoveDoubleSlashes(object):
    def __init__(self, application):
        self.application = application

    def __call__(self, environ, start_response):

        environ['PATH_INFO'] = re.sub('/+', '/', environ['PATH_INFO'])                                                                                                                      

        return self.application(environ, start_response)

在你的主要结尾:

return RemoveDoubleSlashes(config.make_wsgi_app())

我不知道对每个请求进行正则表达式替换有多难,但如果你真的需要,它会解决问题。

编辑

请记住,这是一种在 PATH_INFO 到达金字塔之前对其进行编辑的方法。你不应该那样做。您应该创建有效的 url 并让错误的 url 失败。

它应该是一个快速修复,直到您找到一种方法来修复您的应用程序中错误创建的 url。这个中间件不是治愈方法,它只是一个补丁。检查所有 url 是否有重复的斜杠是没有意义的。

只需重新阅读您的问题,您就可以测试它是否以双斜杠而不是使用正则表达式开头。如果 PATH_INFO 以双斜杠开头,则只是一个简单的replace('//', '/')

正则表达式只有你才会有类似“//fdf//3dfdf/”的东西才有意义

【讨论】:

    【解决方案2】:

    这似乎是 this question 的副本,有一个有用的答案。

    WSGI 不支持双斜线,因此 Pyramid 也不支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 2012-06-11
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多