2009-12-01 4 views
11

에 나는 마코 템플릿 철탑을 사용하고 있는데 나는이 모든 시간을 입력 피하고 싶은 : (마크 문자열로 안전 마코

${ h.some_function_that_outputs_html() | n } 
내가 원하는

기능을 표시 어떻게 든, 또는 변수로 안전을 장고에서 그렇게 할 수 있습니다.) 그래서 나는 항상 pipe-en 할 필요가 없습니다. 어떤 아이디어?

답변

10

html 메쏘드를 클래스를 호출하면 Mako는 그 메소드를 호출하고 템플릿에서 반환하는 값을 출력합니다.

그래서 내가 그랬어 :

def __html__(self): 
    return unicode(self) 

을 h.literal가하는 기본적으로 무엇을 그.

+0

이것은 "h.some_function_that_outputs_html()"에 의해 반환되는 "class"로 들어가야합니다. – Felix

3

mako docs about filtering에 따르면, 당신은 (이 경우이가 조회 모든 템플릿에 대해 기본적으로 적용됩니다)을 TemplateLookup뿐만 아니라 새로운 Template을 만들 때 템플릿 내부에 적용되는 기본 필터를 설정할 수 있습니다 default_filters 인수를 사용하십시오. 당신이 경우하지 않은 (기본적으로 탈출 얻을 당신은 왜 자신이 마코를 사용할 때

# 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']) 

이것은 :

철탑은 config/environment.py 파일 내부 프로젝트의 기본값을 설정 TemplateLookup으로이 인수를 사용). 따라서 설정 파일에서 전역으로 변경하거나 표준 조회를 사용하지 않을 수 있습니다. 물론 탈출 할 필요가있는 것들을 피하기 위해 명시 적으로 필터를 사용해야한다.

또한 철탑 도우미 h.literal와 "안전한 것으로 표시된"문자열을 전달할 수 있습니다, 예를 들어 템플릿에 h.literal('This will <b>not</b> be escaped')을 통과 할 경우, spam라는 이름의 변수로 말을, 당신은 어떤 이스케이프없이 ${spam}를 사용할 수 있습니다.

템플릿 내부에서 특정 함수를 호출 할 때 같은 효과를 원한다면이 함수는 그러한 리터럴을 반환하거나 해당 함수를 도우미에게 제공하여 결과에 h.literal을 호출해야합니다. 원래 기능 만. (또는 "Defing Filtering"을 통해 호출 할 수도 있습니다. (위와 같은 Mako 문서를 참조하십시오.)

+0

고마워, 저에게 도움이되었습니다. – disc0dancer

+0

첫 번째 솔루션을 사용하는 사람들 (default_filters에서 탈출구 제거)에 대한 공지 - 캐시 (rm -r data/templates/*)를 지워야 작동합니다. 무엇이 잘못되었는지 궁금해한다.) – zefciu