2012-01-14 52 views
0

我的web.py应用程序中有一个URL路由,我想运行它来捕获所有到达服务器的URL,但只有在提供任何静态资产之后。如何在web.py中的StaticMiddleware之后执行URL路由

例如,如果theres是我的static目录中的js/test.js,则路径http://a.com/js/tests.js应返回文件内容。但我也有我的URL路由设置,因此有是抓住一切像这样的正则表达式:

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

所以这应该运行只有如果没有静态资产被发现。对http://a.com/js/test.js的请求应返回静态文件test.js,但对http://a.com/js/nope.js的请求应通过CatchAllHandler进行路由。

我已经研究过编写自己的StaticMiddleware,但它只会帮助web.py操作的顺序发生变化。目前,中间件在URL路由处理完成后执行。我需要中间件先运行,然后让url路由清理未提供静态资产的请求。

我有一个想法是使用notfound()函数作为我抓住所有处理程序,但这可能不是最好的。

回答

0

url匹配是python regex。您可以测试/使用python的正则表达式here

中说,这应该为你工作发挥:

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

我最终这样做了,但这不是我想要的修复。我想知道在URL路由执行之前是否有办法让任何中间件针对请求执行。这样,无论哪个url托管静态文件都无关紧要。 – 2012-01-15 02:11:45

0

我还没有web.py的中间件出场,但我的理解.. WSGI中间件的Web之前发生.py可以看到请求/响应。我想,只要你的WSGI MiddleWare配置正确,它就可以工作。

+0

它不起作用。 Web.py必须做错了。 – 2012-01-17 22:39:14

+0

* p *这很糟糕。有add_handler的东西,这使得它很容易..但我想关于你的其他评论,'想让它工作,不管网址'。你怎么知道它是静态内容呢?我很困惑。 * EASIEST *的方式,因为对于生产你想要的东西像mod_wsgi运行你的网站。py脚本,将所有静态内容推送到Web服务器。那么你当然可以在需要做的Web服务器上做任何你想做的事情。 – tara 2012-02-06 16:49:48

0

pouts这很糟糕。有钩子的东西,这使得它很容易,我以前没有,它会看到所有的东西之前..文档在这里:http://webpy.org/cookbook/application_processors

但我想关于您的其他评论, “希望它能够工作,不管URL如何”。你怎么知道它是静态内容呢?我很困惑。由于为了生产,你希望一些其他的web服务器运行你的web.py脚本,所以要把所有的静态内容都推送到web服务器上。那么你当然可以在需要做的Web服务器上做任何你想做的事情。这正是mod_wsgi和apache发生的情况(您将/ static改为指向IN Web服务器)。

也许如果你分享了一个你需要做的事情的实例,我可以帮助你更多。否则,我已经给你三种不同的方式来处理这个问题(不包括使用WSGI中间件)。你还需要多少? :P