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

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

애플리케이션의 템플릿을로드하도록 Jinja2를 구성하는 가장 간단한 방법은 대략 다음과 같습니다.

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))

그러면 기본 설정과 yourapplication python 패키지 내의 templates 폴더 에서 템플릿을 찾는 로더가있는 템플릿 환경이 생성 됩니다.

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

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



답변

방법은 다음과 용도 : 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기본적이고 “가장 간단한”방법 인 것처럼 보입니다. 파이썬을 처음 접하는 사람들에게 이것은 야생 거위 추적으로 이어질 수 있습니다.


답변

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

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


답변

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

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

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

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


답변

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 +에서만 추가됩니다.


답변