문제
나는 Mako 템플릿과 함께 Pylons를 사용하고 있으며 항상 입력을 피하고 싶습니다.
${ h.some_function_that_outputs_html() | n }
어떻게 든 함수를 표시하거나 변수를 안전하게 (Django에서 할 수 있음) 항상 파이프를 할 필요가 없습니다. 어떤 아이디어?
해결책
방금 당신이 a HTML 메소드 수업에서 Mako는 그 메소드를 호출하고 템플릿에서 반환하는 모든 것을 출력합니다.
그래서 나는했다 :
def __html__(self):
return unicode(self)
그것이 기본적으로 H.literal이하는 일입니다.
다른 팁
에 따르면 필터링에 대한 마코 문서, 새를 만들 때 템플릿 내부에 적용되는 기본 필터를 설정할 수 있습니다. Template
뿐만 아니라 TemplateLookup
(이 경우 찾는 모든 템플릿에 대해 기본적으로 적용됩니다), default_filters
논쟁.
Pylons는이 주장을 사용합니다 TemplateLookup
내부 프로젝트의 기본값을 설정합니다 config/environment.py
파일:
# Create the Mako TemplateLookup, with the default auto-escaping
config['pylons.app_globals'].mako_lookup = TemplateLookup(
directories=paths['templates'],
error_handler=handle_mako_error,
module_directory=os.path.join(app_conf['cache_dir'], 'templates'),
input_encoding='utf-8', default_filters=['escape'],
imports=['from webhelpers.html import escape'])
그렇기 때문에 기본적으로 탈출을받는 이유입니다 (Mako를 직접 사용할 때는 그렇지 않습니다). 따라서 구성 파일에서 전역으로 변경하거나 표준 조회에 의존 할 수 없습니다. 물론 필터를 명시 적으로 사용하여 탈출이 필요한 것들을 피해야합니다.
Pylons 도우미와 함께 "안전한 것으로 표시된"문자열을 전달할 수도 있습니다. h.literal
, 예를 들어 통과하는 경우 h.literal('This will <b>not</b> be escaped')
템플릿에 이름이 지정된 변수라고 말하십시오 spam
, 당신은 그냥 사용할 수 있습니다 ${spam}
탈출하지 않고.
템플릿 내부에서 특정 함수를 호출 할 때 동일한 효과를 원한다면이 기능은 문자 그대로 반환하거나 호출하는 기능에 대한 도우미를 제공해야합니다. h.literal
결과적으로 원래 함수를 내버려두고 싶다면. (또는 "필터링 DEF"(위와 같은 Mako Doc 참조)를 통해 호출 할 수 있다고 생각합니다. 아직 실험하지 않았습니다)