2015-06-09 2 views
0

У меня есть приложение, которое сильно использует jinja2. Иногда я испортил и вернул не-строку из фильтра. (или я проваливаю все условия моей ветви и возвращаю Нет). Jinja затем покорно преобразует все, что я дал ему в строку.Отключить автоматическое преобразование в строку выражений jinja2

Я хотел бы, чтобы Jinja не делал этого. Я хотел бы, чтобы Джинджа вместо этого сделал исключение, потерпел крушение, действительно, просто что-нибудь, чтобы сказать мне, что что-то пошло не так. Как я могу это сделать?

ответ

1

Вы можете написать декоратор, который проверяет возвращаемое значение ваших фильтров и вызывает исключение, если это не строка. Для бонусных очков вы можете проверить его __debug__, чтобы он был удален в производстве для нулевого воздействия производительности в этих ситуациях.

import functools 

def must_return_str(func): 

    if not __debug__: return func 

    @functools.wraps(func) 
    def wrapper(*args, **kwargs): 
     ret = func(*args, **kwargs) 
     if isinstance(ret, str): 
      return ret 
     raise TypeError(func.__name__ + " did not return a string") 

    return wrapper 

@must_return_str 
def foo(): 
    return 

foo() 

Недостатком является то, что вы должны применять его к каждой функции, которую вы хотите защитить таким образом. Я не знаю много о Jinja, если честно, но вы можете написать функцию, чтобы применить этот декоратор к каждой функции в модуле или что-то в этом роде, поэтому вам не нужно будет вручную писать @must_return_str.

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