2012-06-21 79 views
4

我已經做了我的研究,並做了一些模式匹配試驗,但我仍然無法弄清楚如何:金字塔:路由模式和約束

  1. 設爲可選路線的一部分。例如:

    /要求(/可選/ {str}) 這裏括號中的部分是可選的。

  2. 將約束應用於路由選擇,以代替通配符字符串,它必須匹配元組中的項目。

    /view_1/{( 'opt_a', 'opt_b', 'opt_c' ...)}在這種情況下 ,如果從元組中的項目匹配時,它的路由如果不是404或FORBIDDEN

我該如何實現這些目標?

謝謝。

回答

10

金字塔不支持可選pa在一條路線中。另一個答案建議*optional,但這將比您要求的哪一個可選佔位符要多得多,並且在路徑末尾沒有選項可以讓您選擇更多模式。

config.add_route('name_with_optional', '/required/{optional}/{str}') 
config.add_route('name', '/required/{str}') 

現在你想爲我想象的那樣使用相同的視圖,因爲你正在考慮佔位符是可選的。因此,簡單地註冊該視圖爲兩種情況:

@view_config(route_name='name_with_optional') 
@view_config(route_name='name') 
def my_view(request): 
    optional = request.matchdict.get('optional') 

optional變量將是None如果'name'是匹配的路由模式。

至於你的第二個問題,你可以簡單地創建一個自定義謂詞。這可能是路線或視圖(請記住這些在金字塔中是分開的)。謂詞的簽名在每種情況下都不相同。

路線(較少)上的謂詞:

def opt_must_contain(info, request): 
    opt = info['match'].get('opt') 
    return opt in ('opt_a', 'opt_b', 'opt_c') 

config.add_route('my_route', '/view_1/{opt}', custom_predicates=[opt_must_contain]) 

如果該謂詞返回False然後用相同的圖案的另一路線,可以匹配(路線被忽略)。

在視圖(多見)謂詞:

def opt_must_contain(context, request): 
    opt = request.matchdict.get('opt') 
    return opt in ('opt_a', 'opt_b', 'opt_c') 

config.add_route('my_route', '/view_1/{opt}') 

@view_config(route_name='my_route', custom_predicates=[opt_must_contain]) 
def my_view(request): 
    opt = request.matchdict.get('opt') 

在視圖中我們就知道opt是必需的選項之一。

+0

感謝您的好評!但它包含一個小錯字:info ['matchdict']應該是info ['match']。 – drnextgis

+0

固定,告訴你路由謂詞不太常見! –

+0

謝謝!很有幫助。 –

3

這很難解釋,但你想要的是在這裏http://docs.pylonsproject.org/projects/pyramid/en/1.0-branch/narr/hybrid.html - 這不是最簡單的讀取,但解釋你在追求什麼。

更新後進一步研究

使用:

config.add_route('name', 'foo/*optional') 

有可能接收剩餘的路徑元素作爲一個元組中描述

自定義謂詞可以用來過濾URL調度http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/urldispatch.html?awesome

+0

你好喬恩。我已經讀過這個。正如你所建議的,我想我需要用Traverse或Hybrid路線。這是一個恥辱,路由系統不包括「可選」和元組匹配。謝謝。 – Phil

+0

Hi @Phil - 思考它,可選可以使用add.route('whatever','/ required/* optional'),其中可選是簡單的而不是/ a/b/c/d等等。 –

+0

* *和** - 我需要更新金字塔 - 閱讀http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/urldispatch.html?awesome - 並向下滾動到Custom Route Predicates - 涵蓋您的元組問題:) –

0

除了使用自定義路由謂詞,您還可以使用URL遍歷來實現這兩點。我寫了一個detailed answer迴應你的其他問題。

我相信遍歷是這種用例的更清潔和「更自然」的解決方案。