1

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

/resource
//resource

不幸的是,我无法将两个 url 添加到同一条路由中,即使我尝试使用该//resource格式,url 匹配在这种情况下也无法正常工作。

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

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

编辑2:似乎整个事件不再有相关信息//resource- 我查询的任何元素都没有显示它。一切都声称我得到了一个请求/

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

4

2 回答 2

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

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

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

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

于 2012-07-16T20:17:03.270 回答
0

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

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

于 2014-09-15T11:03:54.447 回答