我想确保以相同的方式处理以下两个网址(现有客户端以这种方式发送请求):
/resource
//resource
不幸的是,我无法将两个网址添加到同一路线,即使我尝试使用//resource
格式,网址匹配也无法正常使用。
有没有办法解决它,以便我不必在WSGI面前重写服务器中的请求?
编辑:我确实找到了pyramid.event,它允许我访问NewRequest事件,所以我想我可以重写路径,但是通过各种方式得到路径的不同函数的数量,我不知道如何我应该在现有的请求中重写它。
edit2:整个事件似乎不再有关于//resource
的信息 - 我查询的元素没有显示出来。一切都声称我收到了/
的请求。
edit3:它似乎实际上与粘贴或其他模块相关,而不是Pyramid本身 - uwsgi使用双斜杠传递原始path_info而没有任何问题。
答案 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不支持。