如何在web.py中让URL路由在StaticMiddleware之后执行
我在我的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 个回答
唉 这真让人失望。这里有一些钩子(hook)相关的东西,可以让事情变得简单,我之前用过,能看到之前的所有内容……文档在这里:http://webpy.org/cookbook/application_processors
不过我想针对你提到的另一个问题,‘想让它在任何URL下都能工作’。那你怎么知道它是静态内容呢?我有点困惑。最简单的方法是,因为在生产环境中你想让其他的网络服务器来运行你的web.py脚本,所以把所有静态内容放到网络服务器里。这样你就可以在网络服务器上做任何需要做的事情。比如说,mod_wsgi和apache就是这样工作的(你把/static改成指向网络服务器里的某个目录)。
也许如果你能分享一个具体的例子,我能更好地帮助你。否则我现在已经给了你三种不同的方法来解决这个问题(不包括使用WSGI中间件)。你还需要多少种方法呢?:P
我没有玩过web.py的中间件,但我理解的是,WSGI中间件是在web.py处理请求和响应之前就已经运行了。我认为,只要你的WSGI中间件配置正确,它就应该能正常工作。