2012-01-14 18 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