2012-04-23 246 views
1

我不能讓trailing_slash工具來工作。我玩過 trailing_slash工具的選項,沒有任何效果。 我正在使用CherryPy 3.2.2和路由1.13。我想添加一個 尾部斜線。調試輸出中沒有錯誤。在CherryPy的3.2尾隨斜線工具不添加尾隨斜線

如果我去127.0.0.1:8080/blog/它的作品,但是如果我去 到127.0.0.1:8080/blog它不。

我的配置是:

和示例路線爲:

routes = [["blog_index", "/blog/", {'controller': BlogController(), 'action': 'index','entry_id': 'index'}],] 

任何人都可以看到我在做什麼錯?必要的文檔是否存在缺陷或缺少 ? trailing_slash工具是否可以與路由分派器一起使用?

完整的源:https://bitbucket.org/ddevine/icdy/src

回答

1

中的斜槓工具不會與路由調度工作。結尾的斜線工具預計,無論調度員選擇將設置cherrypy.request.is_index爲真或假,它看起來像RoutesDispatcher類並沒有做的。因此,is_index留在無,並且尾部斜槓工具不執行任何操作。這可能是可能是有人用路由良好的知識來解決,在CherryPy的代碼庫,或寫自己的調度這臺is_index,或嘗試寫另一個工具,其在事後修復了is_index。

+0

這是不幸的。看起來我會寫一個自定義調度程序。希望我在嘗試這樣做時不會發現更多無證物品。 – 2012-04-24 01:18:54

+0

我看了一下代碼。 '結果= self.mapper.match(PATH_INFO)'在RoutesDispatcher find_handler後,我把: 如果結果==無: 結果= self.mapper.match(PATH_INFO + 「/」)' 這似乎是工作,但它可能是一件很愚蠢的事情,因爲我還沒有意識到。 – 2012-04-24 14:50:27

+0

@DanielDevine你可能不希望這樣做,因爲一個尾隨斜線和一個沒有的路徑可以在路由中做非常不同的事情。如果你想確保正確性,這不是一個好主意。最好將反向代理Web服務器配置爲將斜線添加到所需的任何路徑。 – 2012-05-04 22:17:55

0

有沒有在路線上的「指數」的概念,因爲你可以定義相同的路徑的2個連接,一個以斜線和一個沒有,並讓它們連接到2個完全不同的控制器和/或行動。你不會在現實生活中做到這一點,但它可能在路由中,所以實際上沒有一種好方法來改變trailing_slash工具來處理這個問題。

恕我直言,trailing_slash工具有點欠缺,它應該被提升到WSGI中間件的級別,該中間件位於默認的WSGI中間管道之前,就像InternalRedirect中間件現在在CherryPy中所做的那樣。舉例來說,如果你已經安裝在SCRIPT_NAME下RouteDispatcher,你不能把trailing_slash工具的任何地方有CP把SCRIPT_NAME後尾隨斜槓,因爲在路線上的所有路由都必須以斜槓開始,它會拋出一個如果在嘗試匹配時path_info是空字符串,則爲RoutesException。

0

長時間問,但這裏是一個方法,使其工作:

def index(index=True): 
    cherrypy.request.is_index = index 
cherrypy.tools.index = cherrypy.Tool('on_start_resource', index) 

config = { 
    ... 
     'tools.trailing_slash.status': 307, 
     'tools.index.on': True, 
    ... 
}