Jinja şablonu doğrudan dosya sisteminden nasıl yüklenir


87

Pocoo.org de jinja API belge devletler:

Jinja2'yi uygulamanız için şablonlar yükleyecek şekilde yapılandırmanın en basit yolu kabaca şuna benzer:
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
Bu, varsayılan ayarlara sahip bir şablon ortamı ve uygulama python paketinizin içindeki şablonlar klasöründe şablonları arayan bir yükleyici oluşturur .

Görünüşe göre, bu o kadar basit değil çünkü içinde şablonlarınız olan bir python paketi yapmanız / yüklemeniz gerekiyor, bu da özellikle kodunuzu dağıtma niyetiniz yoksa gereksiz karmaşıklık getiriyor. Burada ve burada konuyla ilgili SO sorularına başvurabilirsiniz , ancak cevaplar belirsiz ve tatmin edici değil.

Saf bir aceminin yapmak istediği şey, elbette, şablonu bir paketteki bir kaynak olarak değil, doğrudan dosya sisteminden yüklemektir. Bu nasıl yapılır?

Yanıtlar:


129

Bunu şu şekilde yapabilirsiniz : a FileSystemLoaderyerine a kullanın PackageLoader. Web'de burada ve burada örnekler buldum . Şablonunuzla aynı dizinde bir python dosyanız olduğunu varsayalım:

./index.py
./template.html

Bu index.py şablonu bulacak ve işleyecektir:

#!/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)

Görünüşe göre, jinja2 API belgesinin tüm yerleşik yükleyicileri tartışan bir bölümü var , bu yüzden bunu hemen fark etmemek biraz utanç verici. Ancak giriş, PackageLoadervarsayılan, "en basit" yöntem gibi görünecek şekilde ifade edilmiştir . Python'a yeni başlayanlar için bu, vahşi bir kaz kovalamasına yol açabilir.


96
Biraz saçma bir dosyadan tek satırlık bir şablon yükleyemiyorsunuz, örneğinjinja2.load_template('template.html')
Matta

4
Hep Bunu tüm bu ayrıntı koymak benim uygulamalarda jinja2 dediğimiz bir Wrapper var, o zaman böyle diyoruz:Jinja2.render(template_name, data)
Seraf

11
Önemli güvenlik riski! Neredeyse kesinlikle aramak istiyorsun jinja2.Environment(loader=templateLoader, autoescape=True). Veya daha fazla bilgi için api belgelerine bakın . Bu cevabı takip ederek büyük bir XSS güvenlik
açığıyla karşılaştığımı yeni öğrendim

Üstteki her iki bağlantı da bozuk.
20:25 sshow

77

Daha basit bir yol, kurucuyu doğrudan çağırmak ve dosyayı yüklemek için jinj2.Templatekullanmaktır open:

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

1
Maalesef bu, özel filtrelerin kurulmasına izin vermiyor. Özel filtre henüz mevcut olmadığı için şablon yükleme, başlatma sırasında bir hata oluşturur. Ve bu şekilde, yalnızca başlatmadan sonra ortama (filtreyi dahil etmek için) erişebilirsiniz.
Ronan Paixão

18

İşte tek astar:

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

Ardından, şablonu başka bir satırda veya tümü için tek bir satırda oluşturabilirsiniz:

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

1
Ne yazık ki, şablon kalıtımı varsa, Jinja başvurulan şablonları bulamayacağından bu durum bozulacaktır.
Bemmu

4
Eğer miras kullanmayı ve sadece örneğin bazı basit e-posta göndermek için wan't yoksa Ama neyse ki bu basit ve yeterli .. :)
KOSGEB

5

Python 3.4+ ve Jinja2 - v2.11 + kullanıyorsanız, akışı basitleştirmek için python'un yol bilgisini ve Dosya Sistemini birleştirebiliriz

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'nın şablon devralma işlemi iyi çalışmayabileceği için doğrudan kullanmaktan memnun değilim.

Pathlib desteği yalnızca Jinja'nın son sürümüne eklenmiştir - v2.11 +

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.