Template Engine nedir ve nerelerde kullanılır?
Bu flood’da Template Engine
'lerin ne işe yaradığını ve nerelerde kullanıldığını anlatacağım.
Template Engine
adından da anlaşılacağı üzere bir template
'i kendisine geçilen veriler ile harmanlayarak bir sonuç üretir. Aşağıdaki örnekte bir şablon, Python
'daki en popüler Template Engine
olan Jinja2
ile iki farklı veri seti kullanılarak render
edilmiştir.
Template Engine
'lerin ilk ve belki de en yoğun kullanım alanı dinamik web sayfaları oluşturmaktır. Web'in ilk günlerinde dinamik web sayfaları, kullanılan yazılım dilinin sunduğu metin işleme olanakları ile aşağıdaki örneğe benzer biçimde oluşturuluyordu.
Bu şekilde yazılan okuması, test edilmesi zor ve hata yapmaya açık kodlar sebebiyle ölçeği giderek artan web sitelerinin bu yöntemle geliştirilmesi zorlaşmıştır. Tam bu noktada MVC (Model View Controller)
adı verilen ve hala kullanmakta olduğumuz paradigma ortaya çıkmıştır.
MVC
'de özet olarak kullanıcıdan kullanıcıya değişen dinamik veri Model
katmanında, kullanıcıya gösterilecek HTML
'in oluşturulması View
katmanında ve bu iki katman arasındaki koordinasyon ve iş akışları Controller
katmanında bulunmaktadır.
Tahmin edileceği üzere Template Engine
burada View
katmanında görev alır ve Controller
'dan gelen verileri ilgili Template
'i kullanarak render
ederler. Oluşan çıktı (genellikle HTML
) kullanıcıya gösterilir.
Template Engine
'ler şablonları render
etmenin yanı sıra şablonların birbirini içermesine de olanak tanırlar. Bu sayede şablonlar birbirini içerebilir ve birden fazla yerde kullanılan kodların çoklanmasına gerek kalmaz.
Kullanılan web framework’ler genellikle bir default Template Engine
ile birlikte gelir. Bu Template Engine
ilgili framework'e özel olabildiği gibi popüler Template Engine
'lerden biri de olabilir. En bilinenler Mustache
, HandlebarsJS
ve Jinja2
'dur.
Popüler Python
web framework'lerinden Flask
default olarak Jinja2
Template Engine
'ini kullanır. Jinja2
ise başka bir Python
web framework'ü olan Django
'nun Template Engine
'inden esinlenilerek ortaya konmuştur.
Bazı görüşler Template Engine
'de if
, for
, vb logic
kurmaya yardımcı olacak blokların olmaması gerektiğini savunur. Bu görüş temel olarak MVC
katmanlı mimarisinde View
katmanında veri manipülasyonu yapılmaması ilkesine dayanır. Mustache
bu kamptaki bir Engine
'dir.
Template Engine
'lerin kullanıldığı bir alan da Static Site Generator
'lardır. Jekyll
, Hugo
ve Gatsby
araçları örnek olarak verilebilir. gokhansengun.com
gibi statik içerikli siteler konfigürasyon dosyaları ve konvansiyonlar kullanılarak bu araçlar ile oluşturulabilir.
Sayılan Static Site Generator
araçlarının temelinde birer Template Engine
bulunur. Belirlenen konvansiyona göre hazırlanan şablonlar render edilerek HTML
dosyaları oluşturulup kullanıcıya gösterilir. Aşağıda benim bloğumda blogları listeleyen kısım verilmiştir.
Bloğumun Jekyll
altyapısı için https://gokhansengun.com/blogun-teknik-altyapisi/ ve kaynak kodu için https://github.com/gokhansengun/gokhansengun.github.io linklerine bakılabilir.
Template Engine
'ların en önemli kullanım alanlarından biri başta Ansible
, vb Configuration Management
araçları olmak üzere genel olarak DevOps
araçlarıdır. Template Engine
'ler, girdi olarak sağlanacak verilerin dinamik olması gereken durumlarda hayat kurtarıcıdır.
Aşağıda Kubernetes Cluster
kurulumun senaryosunda Etcd
servis adresleri bir başka servisin konfigürasyonuna sağlanmak üzere aşağıdaki gibi oluşturulmuştur. Verilen şablon Ansible
tarafından Jinja2
kullanılarak render edilip servise sağlanmaktadır.
Son olarak Confd
, consul-template
gibi araçlar yine Template Engine
'ler kullanarak çalışma zamanında değişebilecek bilgileri Service Discovery
araçları veya başka araçlardan alarak render ederek uygulamalara sağlayabilirler.