2012-03-04 43 views
2

我有這樣一個問題:我想要一個類的方法來處理不同的URI(對於URI「/解決方案/添加」和「解決方案/編輯」)。所以我寫了這樣的路由:webapp2:路由正則表達式

app = webapp2.WSGIApplication([webapp2.Route(r'/solutions/(add|edit)', handler='solution.SolutionPage:add_edit_solution'), ], debug=True) 

而webapp2給出404錯誤。你能否建議解決這個問題?

Ofcourse我可以寫不同的路線,每URI,但它不是那麼有趣。)

回答

5

隨着webapp2 docs表示,你必須把尖括號中的正則表達式,用冒號分隔的名字和表達。該名稱是可選的,但

everything outside of <> is not interpreted as a regular expression to be matched

因此,像這樣:'/blog/<:\d{4}>/<:\d{2}>'或者在你的情況下,這樣的:

webapp2.Route(r'/solutions/<:(add|edit)>', 
       handler='solution.SolutionPage:add_edit_solution') 
+0

它給出了一個錯誤: TypeError:add_edit_solution()只需要1個參數(給定2)。 我認爲這個錯誤發生是因爲這個表達式用於獲取參數(比如「product_id」等)。 – Dimitry 2012-03-04 21:02:50

+0

@Dimitry,正確。有什麼問題?當你將一個正則表達式傳遞給'Route'時,它將使用正則表達式的組作爲位置參數或者如果你給它們命名的關鍵字參數。 「[名稱(如果已定義)](http://webapp-improved.appspot.com/guide/routing.html#the-url-template)用於爲路由創建URL。設置該值時,值的匹配正則表達式作爲關鍵字參數傳遞給處理函數,否則它作爲位置參數傳遞。「所以如果你想在這裏使用正則表達式,你必須傳遞一個接受* args或** kwargs的處理函數。期。 – senderle 2012-03-04 21:32:14

+0

嗯,是的)它的工作原理。謝謝。在開始時我以不同的方式來實現這一點,我想實現這個沒有任何爭論,但正如我現在看到使用參數是更好的方法。 – Dimitry 2012-03-05 07:00:00

0

如果我可以補充一下。 爲了我自己的目的,我嘗試創建一個執行一些類似操作的處理程序,但重點是我使用了self.request.host或self.request.route而不是參數。

這樣做,並用switch case或if/elif/else循環解析結果,允許我創建一個名爲URIHandler的類,用於將任何類型的請求路由到正確的資源(即使是404/500/yyy錯誤頁面)動態地不必爲每個新資源重寫或添加路由。

所以我會有興趣比較兩種方法來對它們進行一些修改。