programing

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

telecom 2023. 6. 19. 21:08
반응형

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

pocoo.org 있는 jinja API 문서에는 다음과 같은 내용이 있습니다.

응용프로그램에 대한 템플릿을 로드하도록 Jinja2를 구성하는 가장 간단한 방법은 대략 다음과 같습니다.

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

이렇게 하면 기본 설정을 사용하는 템플릿 환경이 생성되고 애플리케이션 python 패키지 내의 템플릿 폴더에서 템플릿을 검색하는 로더가 생성됩니다.

알고 보니 템플릿이 포함된 파이썬 패키지를 만들고 설치해야 하기 때문에 이 방법은 그리 간단하지 않습니다. 이는 특히 코드를 배포할 의도가 없는 경우 불필요한 복잡성을 야기합니다.

저는 그렇게 하는 것에 대해 다음과 같은 관련된 질문들을 발견했지만, 그 대답은 모호하고 만족스럽지 못합니다.

패키지의 리소스가 아닌 파일 시스템에서 직접 템플릿을 로드하려면 어떻게 해야 합니까?

사용FileSystemLoader대신에PackageLoader템플릿과 동일한 디렉토리에 python 파일이 있다고 가정합니다.

./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)

서론에서,PackageLoader접근 방식은 기본적인 "임의" 방법으로 제시되는 것으로 보이지만, 모든 기본 로더를 설명하는 섹션도 있습니다.

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

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

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

from jinja2 import Template

with open('template_file.j2') as f:
    template = Template(f.read())

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

with open('template_file.j2') as f:
    rendered = Template(f.read()).render(var="TEXT")

Python 3.4+와 Jinja2 - v2.11+를 사용하면 Python의 pathlib과 Filesystem을 결합하여 흐름을 단순화할 수 있습니다.

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 - v2.11+에서만 Pathlib 지원이 추가되었습니다.

from jinja2 import Environment, select_autoescape, FileSystemLoader

env = Environment(loader=FileSystemLoader(
searchpath=folder_contain_list_html), autoescape=select_autoescape(['html', 'xml']))

template = env.get_template('file_name_detail_template')

body_html = template.render(**args)

send_email(body_html)

언급URL : https://stackoverflow.com/questions/38642557/how-to-load-jinja-template-directly-from-filesystem

반응형