jinja2 출력을 브라우저 대신 Python으로 파일로 렌더링하는 방법


85

렌더링하려는 jinja2 템플릿 (.html 파일)이 있습니다 (토큰을 내 py 파일의 값으로 대체). 그러나 렌더링 된 결과를 브라우저에 보내는 대신 새 .html 파일에 쓰고 싶습니다. 솔루션이 장고 템플릿과 비슷할 것이라고 상상합니다.

어떻게 할 수 있습니까?

답변:


129

이런 건 어때?

from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('test.html')
output_from_parsed_template = template.render(foo='Hello World!')
print(output_from_parsed_template)

# to save the results
with open("my_new_file.html", "w") as fh:
    fh.write(output_from_parsed_template)

test.html

<h1>{{ foo }}</h1>

산출

<h1>Hello World!</h1>

Flask와 같은 프레임 워크를 사용하는 경우 돌아 가기 전에보기 하단에서이 작업을 수행 할 수 있습니다.

output_from_parsed_template = render_template('test.html', foo="Hello World!")
with open("some_new_file.html", "wb") as f:
    f.write(output_from_parsed_template)
return output_from_parsed_template

빠른 답변 감사합니다. 내가 올바르게 이해하고 있다면 첫 번째 부분으로 : jinja2 import Environment, FileSystemLoader env = Environment (loader = FileSystemLoader ( 'templates')) template = env.get_template ( 'test.html') output_from_parsed_template = template.render (foo = 'Hello World!') print output_from_parsed_template 인쇄 줄을 일종의 파일 쓰기 줄로 바꿀 수 있습니다. 그 맞습니까? 파일에 쓰는 그런 줄은 어떻게 생겼을까 요? 레. Flask, 이것은 더 큰 앱의 작은 부분이므로 프레임 워크를 사용할 수 있을지 모르겠습니다.
Bill G.

설명해 주셔서 감사합니다. 나는 마침내 이것을 시도 할 기회가 있었다. 처음에 "No such file or directory : 'my_new_file.html'"오류가 발생했습니다. 분명히 파일이 이미 존재해야합니다. 그런 다음 템플릿 파일을 복사하고 이름을 'my_new_file.html'로 변경했습니다. 이제 오류가 발생합니다. IOError : File not open for writing. Google App Engine에서 개발 중이기 때문일까요?
Bill G.

@BillG. 아니, 내 실수였다. 위의 변경 시도 :으로 변경 rb되었습니다 wb.
sberry

빠른 응답 감사합니다. 나는 WB하는 RB를 변경하고 지금은 다음과 같은 오류 얻을 : IO 오류 : 유효하지 않은 모드 : WB
빌 G.

)하단 코드 섹션의 첫 번째 줄 끝에 누락이 있습니다 . 나는 그것을 추가하려고했지만 그래서 수정이> 6 자 (어리석은 제한)가되어야합니다.
egeland


8

따라서 템플릿을로드 한 후 render를 호출 한 다음 출력을 파일에 씁니다. 'with'문은 컨텍스트 관리자입니다. 들여 쓰기 안에는 'f'라는 객체와 같은 열린 파일이 있습니다.

template = jinja_environment.get_template('CommentCreate.html')     
output = template.render(template_values)) 

with open('my_new_html_file.html', 'w') as f:
    f.write(output)

따라서 다음과 같이 표시됩니다. TEMPLATE_DIR = os.path.join (os.path.dirname ( file ), 'templates') jinja_environment = \ jinja2.Environment (autoescape = False, loader = jinja2.FileSystemLoader (TEMPLATE_DIR)) 템플릿 = jinja_environment.get_template ( 'CommentCreate.html') self.response.out.write (template.render (template_values)) with open ( 'my_new_html_file.html', 'w') as f : f.write (response.content) 여기서 이미 채워진 template_values입니다. 필요에 따라 수정하십시오. 감사.
Bill G.

설명해 주셔서 감사합니다. 나는 마침내 이것을 시도 할 기회가 있었다. 처음에 "No such file or directory : 'my_new_file.html'"오류가 발생했습니다. 분명히 파일이 이미 존재해야합니다. 그런 다음 템플릿 파일을 복사하고 이름을 'my_new_file.html'로 변경했습니다. 이제 오류가 발생합니다. IOError : File not open for writing. Google App Engine에서 개발 중이기 때문일까요?
Bill G.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.