파일 시스템에서 직접 jinja 템플릿을로드하는 방법


85

pocoo.orgjinja API 문서는 다음과 같이 설명합니다.

애플리케이션의 템플릿을로드하도록 Jinja2를 구성하는 가장 간단한 방법은 대략 다음과 같습니다.
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
그러면 기본 설정과 yourapplication python 패키지 내의 templates 폴더 에서 템플릿을 찾는 로더가있는 템플릿 환경이 생성 됩니다.

알다시피, 템플릿이 포함 된 파이썬 패키지를 만들고 설치해야하기 때문에 이것은 그렇게 간단하지 않습니다. 특히 코드를 배포 할 의도가없는 경우 불필요한 복잡성이 많이 발생합니다. 여기여기 에서 주제에 대한 SO 질문을 참조 할 수 있지만 답변은 모호하고 만족스럽지 않습니다.

순진한 초보자가 원하는 것은 패키지의 리소스가 아닌 파일 시스템에서 직접 템플릿을로드하는 것입니다. 어떻게하나요?

답변:


124

방법은 다음과 용도 : FileSystemLoader(A)의 대신을 PackageLoader. 여기여기 웹에서 예제를 찾았 습니다 . 템플릿과 같은 디렉토리에 파이썬 파일이 있다고 가정 해 보겠습니다.

./index.py
./template.html

이 index.py는 템플릿을 찾아 렌더링합니다.

#!/usr/bin/python
import jinja2

templateLoader = jinja2.FileSystemLoader(searchpath="./")
templateEnv = jinja2.Environment(loader=templateLoader)
TEMPLATE_FILE = "template.html"
template = templateEnv.get_template(TEMPLATE_FILE)
outputText = template.render()  # this is where to put args to the template renderer

print(outputText)

jinja2 API 문서에는 모든 내장 로더에 대해 설명 하는 섹션이 있으므로 바로 알아 차리지 못한 것이 부끄럽습니다. 그러나 소개는 PackageLoader기본적이고 "가장 간단한"방법 인 것처럼 보입니다. 파이썬을 처음 접하는 사람들에게 이것은 야생 거위 추적으로 이어질 수 있습니다.


94
한 줄에 파일에서 템플릿을로드 할 수없는 일종의 우스꽝스러운 jinja2.load_template('template.html')
Matt

4
난 항상 난 그냥이 모든 상세를 넣어 내 응용 프로그램에서 Jinja2를 호출하는 래퍼를 다음과 같이 호출 :Jinja2.render(template_name, data)
Seraf

11
중요한 보안 위험! 당신은 거의 확실히 전화하고 싶습니다 jinja2.Environment(loader=templateLoader, autoescape=True). 또는 자세한 정보 는 API 문서 를 참조하십시오. 방금이 답변을 따름으로써 주요 XSS 취약점이 발견되었다는 사실을 알게되었습니다. /
andrewdotn

상단의 두 링크가 모두 끊어졌습니다.
sshow

76

더 간단한 방법은 jinj2.Template생성자 를 직접 호출 open하고 파일을로드하는 데 사용 하는 것입니다.

from jinja2 import Template
with open('template.html.jinja2') as file_:
    template = Template(file_.read())
template.render(name='John')

1
불행히도 이것은 사용자 정의 필터 설정을 허용하지 않습니다. 사용자 지정 필터가 아직 존재하지 않기 때문에 템플릿로드시 초기화 중에 오류가 발생합니다. 이렇게하면 초기화 후에 만 ​​환경 (필터 포함)에 액세스 할 수 있습니다.
Ronan Paixão 19:09:19

17

다음은 하나의 라이너입니다.

template = Template(open('template_file.j2').read())

그런 다음 템플릿을 다른 줄에 렌더링하거나 한 줄에 모두 렌더링 할 수 있습니다.

rendered = Template(open('template_file.j2').read()).render(var="TEXT")

1
안타깝게도 Jinja는 참조 된 템플릿을 찾을 수 없기 때문에 템플릿 상속이있는 경우 중단됩니다.
Bemmu

3
하지만 운 좋게도 상속을 사용하지 않고 간단한 이메일을 보내지 않으려면 간단하고 충분합니다. 예를 들어 .. :)
smido

2

Python 3.4+ 및 Jinja2-v2.11 +를 사용하는 경우-Python의 pathlib와 파일 시스템을 결합하여 흐름을 단순화 할 수 있습니다.

from pathlib import Path
...

p = Path(__file__).parent.parent / 'templates' # sample relative path
env = Environment(
    loader=FileSystemLoader(Path(p)))
template = env.get_template('your_file.jinja2')

Template(file)Jinja의 템플릿 상속 처리가 잘되지 않을 수 있으므로 직접 사용하는 것이 불편합니다.

Pathlib 지원은 최신 버전의 Jinja-v2.11 +에서만 추가됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.