2012-07-25 6 views
4

사용자 정의 필터를 사용하여 jinja2에서 파이썬 함수를 호출 할 수 있지만 하나 이상의 매개 변수가있는 함수 만 호출 할 수 있습니다. 다음에서는 변수가 아닌 함수로 ctest를 처리하기 위해 junk 매개 변수를 전달해야합니다.jinja2 템플릿에서 매개 변수없이 파이썬 함수를 호출하는 방법

{{ ctest() }}을 호출해도 작동하지 않습니다.

이것을 강제로 호출하는 다른 방법이 있습니까? 아니면 다른 접근 방법을 사용해야합니까?

코드 :

def ctest(stuff): 
    return "yeah!" 

template_env = jinja2.Environment (loader = jinja2.FileSystemLoader(template_file_root)) 
#custom filters 
template_env.filters['ctest'] = ctest 

템플릿 :

Working? {{ junk|ctest }} 

출력 :

working? yeah! 
+0

가능한 중복 [jinja2에서 파이썬 함수를 호출 (http://stackoverflow.com/questions/6036082/call-a-python-function-from-jinja2) – geoffspear

+0

게시하기 전에이 질문을 살펴 보았지만 매개 변수없이 템플릿에서 필터를 호출하는 방법은 설명하지 않았습니다. 그것은 내가 이미에있는 지점에 도달하는 방법을 설명합니다. – chrisst

+0

두 번째 답변보기 :'{{clever_function()}} ' – geoffspear

답변

1

답변에 코멘트 요약 : (Wooble는 지적)

필터에 추가하여 함수를 호출 할 수있는 기능이 정말 있기 때문에 이것에 대해가는 올바른 방법이 아니다을 나는 필터링을 찾는 게 아니에요 아무것도.

대신 함수는 단지 template_env.globals 추가해야 :

template_globals.filters['ctest'] = ctest 
{{func()}}
0

글쎄, 그들은 필터를, 그래서 그들이 뭔가를 필터링 할 것으로 기대합니다. 동기 부여가 인수를 거치지 않고 템플릿 외부에서 호출 할 역할을하려는 경우에 서명을 변경 :

def ctest(*args): 

후 바로 인수를 무시; 인수 나 인수가없는 경우에는 작동합니다.

+1

위의 예제는 나를 위해 작동하지만 여전히 제로 param 메서드를 호출하고 싶습니다. 래퍼 메서드를 작성하지 않고도 다른 파이썬 라이브러리를 호출 할 수 있기를 원합니다. 특히 socket.gethostname()을 호출하려고합니다. – chrisst

+0

안녕하세요, 미래의 롤 람다를 사용해 보셨나요? 필자는 본질적으로 함수를 래핑하는 것이지만 보통 때보 다 덜 입력하는 것으로 이해합니다. 나는이 tempEnv.globals [ 'test'] = lambda : socket.gethostname()'을 피곤하게했다. –

0

출력을 렌더링한다. {% call func() %}{%endcall%}caller 매개 변수가있는 func()을 호출합니다.

jinja에는 템플릿이나 다른 템플릿 부작용을 렌더링하지 않고도 python 함수를 호출 할 수있는 간단한 방법이 없을 것 같습니다. 내가 생각 해낸 해결 방법은 다음과 같습니다

{% if func() %}{% endif %} 
관련 문제