2015-05-07 57 views
1

我在我的一個金字塔應用程序中使用了一些自定義謂詞。由於金字塔版本1.5,啓動應用程序時,會顯示以下信息:金字塔中的自定義路由謂詞

my_project\__init__.py:110: DeprecationWarning: The "custom_predicates" 
argument to Configurator.add_route is deprecated as of Pyramid 1.5. Use 
"config.add_route_predicate" and use the registered route predicate as a 
predicate argument to add_route instead. See "Adding A Third Party 
View,Route, or Subscriber Predicate" in the "Hooks" chapter 
of the documentation for more information. 

我想用新的方法......但我無法找到該怎麼做一個忠告...

即使文檔說明了舊方法:https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/urldispatch.html#custom-route-predicates

我試圖定義我自謂我my_project\__init__.py文件,使用類似:

def my_predicate(info, request): 
    if request.something: 
     return True 
    return False 

def main(global_config, **settings): 
    ... 
    config.add_route_predicate('my_predicate_name', my_predicate) 

    config.add_route('my_route_name','/route_name/', 'my_predicate_name') 
    ... 

但是,沒有任何效果,我都知道,使用'my_predicate_name'不是好辦法......我知道我失去了一些東西,但我不能得到什麼......

編輯

如果我改變我的代碼:

config.add_route('my_route_name','/route_name/', my_predicate_name=True) 

然後金字塔引發以下錯誤:

NameError: global name 'my_predicate_name' is not defined 

它看起來像add_route_predicate沒有任何效果...

+0

注意你在過去的代碼段是不合法的Python ...如果有的話,它應該是'config.add_route( 'my_route_name', '/ ROUTE_NAME /',my_predicate_name = TRUE)' – Sergey

+0

對不起...這是一個錯字,我更新了我的問題 – kalbermattenm

回答

3

在文檔中此位置應解釋如何一個是否履行定製謂:http://docs.pylonsproject.org/projects/pyramid/en/master/narr/hooks.html#view-and-route-predicates

這是一個額外的例子。只有當查詢參數中有lang=fr時,纔會返回法語回覆,否則默認情況下英文迴應匹配。

因此/返回Hello/?lang=fr返回bonjour

from wsgiref.simple_server import make_server 
from pyramid.config import Configurator 
from pyramid.response import Response 


def hello_world(request): 
    return Response('Hello') 


class LanguagePredicate(): 

    def __init__(self, val, config): 
     self.val = val 

    def text(self): 
     return 'lang = %s' % (self.val,) 

    phash = text 

    def __call__(self, context, request): 
     return request.GET.get('lang') == self.val 


def hello_world_fr(request): 
    return Response('bonjour') 

def main(): 
    config = Configurator() 

    config.add_route_predicate('lang', LanguagePredicate) 

    config.add_route('hello_fr', '/', lang='fr') 
    config.add_route('hello', '/')  

    config.add_view(hello_world_fr, route_name='hello_fr') 
    config.add_view(hello_world, route_name='hello') 


    app = config.make_wsgi_app() 
    return app 

if __name__ == '__main__': 
    app = main() 
    server = make_server('0.0.0.0', 6547, app) 
    print ('Starting up server on http://localhost:6547') 
    server.serve_forever() 
+1

是的,我明白,但我試圖執行路由謂詞... – kalbermattenm

+0

我更新了我的答案以使用add_route_predicate。該模式相同,文檔適用於查看和路由謂詞。 –

+0

明白了!這工作,非常感謝! – kalbermattenm