2012-07-15 52 views
0

我想請確保以下兩個網址都以同樣的方式(有一個現有的客戶端,發送請求這樣)處理:如何忽略重複斜線金字塔

/resource 
//resource 

可惜我不能將這兩個網址添加到相同的路線,即使我嘗試使用//resource格式,但在這種情況下,網址匹配無法正常工作。

有什麼辦法來解決它,這樣我就不必重寫,服務器將請求在WSGI的面前?

編輯:我找到了pyramid.event,它允許我訪問NewRequest事件,所以我認爲我可以重寫路徑,但是以不同的方式獲取路徑的不同函數的數量,我不確定我應該如何在現有的請求中重寫它。

EDIT2:好像整個事件沒有關於//resource信息了 - 沒有元素我查詢顯示它。一切都聲稱我得到了/的請求。

EDIT3:這似乎是實際上與粘貼或兩者之間的某個其它模塊,而不是金字塔本身 - uwsgi通過雙斜線原來PATH_INFO沒有任何問題。

+0

只是一個想法在這裏。你可以創建一箇中間件,在將它傳遞給金字塔之前修改PATH_INFO變量 – 2012-07-16 11:55:48

+0

順便說一句,似乎你發現了一個女服務員的錯誤。雙斜槓剝奪第一個路徑部分顯然'// something/fun'變成'/ fun',雖然使用三斜槓給了我正確的結果 – 2012-07-16 20:31:46

回答

0
import re 

class RemoveDoubleSlashes(object): 
    def __init__(self, application): 
     self.application = application 

    def __call__(self, environ, start_response): 

     environ['PATH_INFO'] = re.sub('/+', '/', environ['PATH_INFO'])                              

     return self.application(environ, start_response) 

在你的主要的結尾:

return RemoveDoubleSlashes(config.make_wsgi_app()) 

我不知道它可能是如何努力做一個正則表達式對每個請求代替,但它會做的伎倆,如果你真的很需要那。

編輯

請記住,這是編輯的PATH_INFO之前就到達金字塔的方式。你不應該那樣做。您應該創建有效的網址,並讓錯誤的網址失敗。

這應該是一個和quickfix直到找到一個方法來解決錯誤地創建網址,在您的應用程序。這中間件不治本,它只是一個補丁。檢查所有網址是否有重複的斜線是沒有意義的。

只是重讀你的問題,如果它與雙斜槓,而不是使用正則表達式開始,你可以測試一下。如果PATH_INFO以雙斜槓開始,那麼只需一個簡單的replace('//', '/')即可。

正則表達式纔有意義,你就必須像「// // FDF 3dfdf /」

0

這似乎是this question的副本,其中有一個有用的答案。

WSGI不支持基本上雙斜線,因此Pyramid不支持。