2013-09-12 3 views
0

В моем коде Pyramid я регистрирую функцию несколько раз для разных маршрутов и шаблонов. Так что мое приложение отображает те же данные в различных форматах/просмотров:Пользовательский декоратор для представлений Pyramid: функция просмотра игнорируется?

class MyViews(object): 
    @view_config(route_name='A', renderer='A') 
    @view_config(route_name='B', renderer='B') 
    @view_config(route_name='C', renderer='C') 
    @view_config(route_name='D', renderer='D') 
    def my_view(self): 
     return results 

Это прекрасно работает, а потому, что у многих из этих случаев после определенной схеме, я хотел бы упростить мой код, как это:

def entity_search_method(type_name): 
    def decorator(fkt): 
     fkt = view_config(route_name = A % type_name, ...)(fkt) 
     fkt = view_config(route_name = B % type_name, ...)(fkt) 
     fkt = view_config(route_name = C % type_name, ...)(fkt) 
     fkt = view_config(route_name = D % type_name, ...)(fkt) 
     return fkt 
    return decorator 

И потом:

class MyViews(object): 
    @entity_search_method('some_type') 
    def my_view(self): 
     return results 

В моем понимании, это должно сделать то же самое, как вызов декораторы непосредственно. Мне даже не нужно заботиться о functools.wrap или что-то в этом роде, потому что я даже не создаю новую функцию самостоятельно. Но Пирамида игнорирует метод. Какой-нибудь намек на то, что мне может не хватать?

ответ

2

view_config и основная библиотека, чтобы подобрать эти декораторы venusian несколько сложнее. Я думаю, что вам не хватает здесь, что вам нужно указать view_config(..., _depth=1), чтобы указать венузиану, что декоратор был обернут. Глубина - это показатель того, где фактическая функция, которую вы украшаете, (в кадрах стека) относительно использования декоратора view_config.

+0

Спасибо, что решил мою проблему.Поскольку я, вероятно, буду делать больше этого материала в будущем: можете ли вы указать мне на какую-то документацию, где я могу точно понять, что происходит? – Achim

+1

Что касается view_config, он задокументирован в его API здесь http://docs.pylonsproject.org/projects/pyramid/en/latest/api/view.html#pyramid.view.view_config, но отсутствует описательные документы для расширения/оберточная бумага. Похоже, что венецианцы также не хватает документов для глубины. Просто откройте https://github.com/Pylons/venusian/issues/30, надеюсь, исправить это. –

0

Вы не сделали apply декораторы; вызовите возвращаемое значение `view_config(), передавая в элементе для украшения:

def entity_search_method(type_name): 
    def decorator(fkt): 
     fkt = view_config(route_name = A % type_name, ...)(fkt) 
     fkt = view_config(route_name = B % type_name, ...)(fkt) 
     fkt = view_config(route_name = C % type_name, ...)(fkt) 
     fkt = view_config(route_name = D % type_name, ...)(fkt) 
     return fkt 
    return decorator 

Синтаксис @view_config(route_name='D', renderer='D') принимает возвращаемое значение выражения и вызывает его на следующий объект (или функция вывода другого декоратор), определенной под ним в источнике, с возвращаемым значением, заменяющим объект для украшения.

Другими словами, следующее:

@some_expression 
def some_function(): 
    pass 

становится:

def some_function(): 
    pass 
some_function = some_expression(some_function) 

но вид декораторы пирамиды сами по себе, возвращающие вызываемых объектов функцию декоратора.

+0

Извините, я обновил свой вопрос. Вы правы, но это именно то, что я делаю в своем коде. Я просто ошибся в копировании и сокращении кода. Я применяю декораторы, но метод по-прежнему игнорируется. – Achim

+0

Что произойдет, если вы примените одни и те же декораторы * вручную * поверх этого декоратора? Итак, разместите их перед строкой '@entity_search_method ('some_type')? –

+0

Он отлично работает. Он также работает, если я ставил свои собственные поверх других. – Achim

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

  • Нет связанных вопросов^_^