İçeriğe geç

Django Template Syntax Check

Giriş.

Herkese selamlar, geçtiğimiz günlerde geliştirdiğim eski bir projede, bir bilgi mailinin kullanıcılara bir süredir gönderilemediği konusunda geri dönüş aldım.

SMTP sunucusu mu problem, yoksa template bir şekilde bulunamıyor mu diye kafa patlatırken sorunun aslında çok daha basit olduğunu Celery task loglarını incelerken gördüm.

TemplateSyntaxError 🥲

django.template.exceptions.TemplateSyntaxError: Invalid block tag on line 47: 'els', expected 'elif', 'else' or 'endif'. Did you forget to register or load this tag?

Computer-smash GIFs - Get the best GIF on GIPHY

 

Template’i fixledikten sonra, bu durumu tekrar etmemek adına uygulama genelindeki tüm templateleri deployment öncesi testlerde kontrol eden bir çözüm buldum. Bulduğum çözüm üstüne konuşacak olursak;

Django-Extensions.

Django extensions, farklı blog yazılarındada üzerine konuştuğumuz gibi gerçekten çok güçlü ve yararlı bir araç.

Yukarıda bahsettiğim durumu da kontrol edebilmek için basit ama etkili bir management command’e sahip.

validate_templates.

Projede bulunan templateleri dolaşarak, get_template metodunu çağırıp herhangi bir hatayı size raporlayabiliyor.

Örneğin;

$ python manage.py validate_templates
/your_project_path/templates/mails/welcome.html: TemplateSyntaxError Invalid block tag on line 47: 'els', expected 'elif', 'else' or 'endif'. Did you forget to register or load this tag?
CommandError: 1 errors found

 

Yararlı komut argümanlarına ve ayarlarına bakacak olursak;

break

Herhangi bir template üstünde hata bulunması durumunda direkt olarak akışı kesmenize olanak sağlıyor.

 

–ignore-app veya VALIDATE_TEMPLATES_IGNORE_APPS

Herhangi bir appi komut üstünden yada doğrudan settings üstünden görmezden gelmek isterseniz kullanabilirsiniz. Örneğin admin ve varsayılan user uygulaması.

VALIDATE_TEMPLATES_IGNORE_APPS = ["django.contrib.admin", "django.contrib.auth", "django_extensions"]
$ python manage.py validate_templates --ignore-app django.contrib.admin --ignore-app django_extensions --ignore-app django.contrib.auth

 

VALIDATE_TEMPLATES_EXTRA_TEMPLATE_DIRS

Projenizde template klasörlerini dinamik değiştiren bir yapıya sahipseniz, uçtan uca hepsinin test edilebilmesi için ekstra klasorleri belirleyebilirsiniz.

VALIDATE_TEMPLATES_EXTRA_TEMPLATE_DIRS = ["extra_templates"]

Deployment adımlarına ekleme.

Deployment öncesi çalışan testlerinize call_command yardımıyla validate_templates’i ekleyerek bunu bir deployment adımı olarak ayarlayabilirsiniz. Herhangi bir syntax hatası olması durumunda test fail olacaktır.

import unittest
from django.core.management import call_command

class MyTests(unittest.TestCase):
    def test_validate_templates(self):
        call_command("validate_templates")

Sonuç.

Ufak bir hata olsada öğrettiği çok şey oldu. Umarım bir gün başka birilerinin de işine yarar 🙂

django-extensions dökümantasyonu.

Bu blog üzerinde daha fazla tips&trick okumak isterseniz.

İyi akşamlar!

 

Tarih:Blog

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Göster
Gizle