如何忽略金字塔中的重复斜杠

时间:2012-07-15 21:09:21

标签: python url-routing pyramid

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

/resource
//resource

不幸的是,我无法将两个网址添加到同一路线,即使我尝试使用//resource格式,网址匹配也无法正常使用。

有没有办法解决它,以便我不必在WSGI面前重写服务器中的请求?

编辑:我确实找到了pyramid.event,它允许我访问NewRequest事件,所以我想我可以重写路径,但是通过各种方式得到路径的不同函数的数量,我不知道如何我应该在现有的请求中重写它。

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

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

2 个答案:

答案 0 :(得分:0)

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失败。

它应该是一个quickfix,直到你找到一种方法来修复你的应用程序中错误创建的URL ..这个中间件不是一种治疗方法,它只是一个补丁。检查所有重复斜杠的网址是没有意义的。

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

正则表达式只有你会有“// fdf // 3dfdf /”这样的东西

答案 1 :(得分:0)

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

WSGI基本上不支持双斜杠,因此Pyramid不支持。