2015-05-07 4 views
1

Я использую некоторые пользовательские предикаты в одном из приложений Pyramid. Поскольку Пирамида версии 1.5, при запуске приложения, отображается следующее сообщение:Пользовательские предикаты маршрута в Pyramid

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' не хороший способ ... Я знаю, что я что-то не хватает, но я просто не могу получить то, что ...

EDIT

Если изменить мой код:

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

Затем Pyramid выдает следующее сообщение об ошибке:

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

Это место в документации должны объяснить, как implementat пользовательский предикат: http://docs.pylonsproject.org/projects/pyramid/en/master/narr/hooks.html#view-and-route-predicates

Вот дополнительный пример. Ответ на французском языке должен быть возвращен только тогда, когда lang=fr находится в аргументах запроса, иначе ответ по-английски соответствует по умолчанию.

So /Hello и /?lang=frbonjour.

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

Смежные вопросы