如何在web.py中让URL路由在StaticMiddleware之后执行

0 投票
3 回答
769 浏览
提问于 2025-04-17 10:13

我在我的web.py应用程序中有一个URL路由,想要让它捕捉到所有访问服务器的URL,但前提是先处理完所有的静态资源。

举个例子,如果我的static目录里有一个js/test.js文件,那么访问http://a.com/js/test.js时应该返回这个文件的内容。但是我也设置了URL路由,有一个正则表达式可以捕捉到所有的请求,像这样:

urls = ('/.*', 'CatchAllHandler')

所以这个路由应该仅在没有找到静态资源的情况下运行。也就是说,访问http://a.com/js/test.js时应该返回静态文件test.js,而访问http://a.com/js/nope.js时则应该通过CatchAllHandler来处理。

我考虑过自己写一个StaticMiddleware来实现这个功能,但这只有在改变web.py操作的顺序时才有用。目前,middleware是在处理完URL路由后执行的。我需要的是让middleware先运行,然后再让URL路由处理那些没有找到静态资源的请求。

我想到的一个办法是使用notfound()函数作为我的捕捉所有请求的处理器,但这可能不是最好的选择。

3 个回答

0

这真让人失望。这里有一些钩子(hook)相关的东西,可以让事情变得简单,我之前用过,能看到之前的所有内容……文档在这里:http://webpy.org/cookbook/application_processors

不过我想针对你提到的另一个问题,‘想让它在任何URL下都能工作’。那你怎么知道它是静态内容呢?我有点困惑。最简单的方法是,因为在生产环境中你想让其他的网络服务器来运行你的web.py脚本,所以把所有静态内容放到网络服务器里。这样你就可以在网络服务器上做任何需要做的事情。比如说,mod_wsgi和apache就是这样工作的(你把/static改成指向网络服务器里的某个目录)。

也许如果你能分享一个具体的例子,我能更好地帮助你。否则我现在已经给了你三种不同的方法来解决这个问题(不包括使用WSGI中间件)。你还需要多少种方法呢?:P

0

这个网址匹配是用 Python 的 正则表达式 来实现的。你可以在 这里 测试和玩弄 Python 的正则表达式。

那么,下面的代码应该能帮到你:

('/(?!static)(.*)', 'CatchAllHandler')
0

我没有玩过web.py的中间件,但我理解的是,WSGI中间件是在web.py处理请求和响应之前就已经运行了。我认为,只要你的WSGI中间件配置正确,它就应该能正常工作。

撰写回答