Giriş.
Merhabalar.
SAAS (Software as a Service) projeleri bir şema olarak geliştirilir ve müşterilere abonelik sistemi üzerinden dağıtılarak hizmet verir. Fakat zaman zaman proje şemalarının dışında kalan özel gereksinimler doğabilir. En sık karşılaşılan durumlardan birisi, marka veya müşterinin proje içinde yerleşik olarak bulunmayan, fakat sunulmasını istedikleri özel HTML şablonlarıdır.
Bu sayfalara örnek olarak bize ulaşın, gizlilik ve güvenlik sözleşmesi veya cookieler hakkında detaylı bilgi barındıran statik sayfalar verilebilir. Statik sayfalar kullandığınız web sunucusu (Nginx, Apache vs) üzerinden sunulabilir fakat bu web sunucu üzerindeki konfigürasyon hakkında endişlenmenizi ve bir değişiklik durumunda çokta hızlı aksiyon alamama durumunu ortaya çıkarır. Şanslıyız ki database driven bir framework olan Django’nun yerleşik olarak buna bir çözümü bulunmakta. Flatpages app!
Flatpages app.
Django, flatpages uygulaması ile bu tarz özel sayfaları Django template language kullanarak oluşturmanızı ve admin panelinden ya da Python API kullanarak yönetmenize olanak sağlar. Arka planda Django modellerini kullanır ve gerekli içerik ya da template yolunu, sayfanın sunulacağı urli, sunulacağı siteler vs gibi bir takım bilgileri veritabanında barındırır.
Flatpage model.
Kurulum.
#settings.py INSTALLED_APPS = [ # other installed apps 'django.contrib.sites', 'django.contrib.flatpages' ] SITE_ID=1
Flatpages app, site frameworküne ihtiyaç duyar. Dolayısıyla ilk olarak sites daha sonra da flatpages uygulaması eklenir. Daha sonra üzerinde çalışılan site id eklenir. Eğer sites frameworkü kullanarak birden fazla site ile çalışmıyor iseniz bu değer 1 olacaktır. Son olarak;
MIDDLEWARE = [ # other middlewares. 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware', ]
$ python manage.py migrate
çalıştırılır.
Kullanım.
Flatpageleri 2 farklı şekilde oluşturmak ve kullanmak mümkün. Bu iki yöntem;
- Base bir template kullanarak render.
- Doğrudan template’i ve yolunu tanımlayarak render etmek.
İkinci yöntem daha fazla tercih edilse de 2sinide örnekleyelim. 2. yöntemi sizinde daha esnek bulacağınıza eminim.
Base template üzerinden kullanım.
Flatpages app bir sayfayı render edeceği zaman ilk olarak ilgili sayfanın template yoluna bakar, burada bir template yolu veya doğrudan templatein bulunamaması durumunda, flatpages/default.html yoluna bakar ve render edilecek sayfanın içeriğini bu template içerine gömerek render eder.
Örnek olması açısından flatpages/default.html yoluna aşağıdaki gibi bir base template ekleyelim.
# templates/flatpages/default.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>{{ flatpage.title }}</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"> </head> <body> <nav class="navbar navbar-dark bg-dark"> <div class="container"> <a class="navbar-brand" href="#">Egehan Gundogdu</a> </div> </nav> <div class="container mt-4"> <h1>{{flatpage.title}}</h1> {{ flatpage.content }} </div> </body> </html>
Render sırasında, ilgili flatpage nesnesi template contexte bağlanır ve doğrudan template içerisinde yukarıdaki gibi kullanılır.
Daha sonra bir flat page eklemek için admin panelini kullanalım.
İlgili urli takip ederek sayfayı görüntüleyecek olursak;
base bir template kullanarak ilgili özel şablonu render edebildik. Siz de deneyin! 🙂
Her sayfaya özel template tanımlamak.
Oluşturacağınız sayfalar projeniz genelinde kullanılan diğer komponentlere bağlı ve nispeten daha kompleks ise bu yöntem daha kullanışlı olacaktır.
İlk olarak templatei oluşturalım;
#templates/your_app/cookies.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>{{ flatpage.title }}</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"> </head> <body> {% include 'your_app/navbar.html' %} <div class="container mt-4"> <h1>Detailed cookie usage.</h1> <p> Lorem ipsum dolor sit amet consectetur, adipisicing elit. Eius, tempora? Quibusdam consequuntur vero a laboriosam harum ad expedita amet numquam! </p> </div> </body> </html>
Daha sonra flatpage oluşturacağız. Fakat bu sefer Python API kullanarak shell üzerinden bu işlemi gerçekleştirelim.
>>> from django.contrib.sites.models import Site >>> from django.contrib.flatpages.models import FlatPage >>> from django.conf import settings >>> site = Site.objects.get(id=settings.SITE_ID) >>> data = {"title":"Cookies", "template_name":"your_app/cookies.html", "url":"/cookies/"} >>> flat_page = FlatPage.objects.create(**data) >>> flat_page.sites.add(site)
Çok fazla import? auto completion yok? Django shell deneyiminizi bir üst noktaya taşımak isterseniz, buyursunlar 🙂
Eğer custom bir template kullanılacak ise content alanı boş bırakılabilir. Fakat template yolundan emin olmanızı öneririm bulunamaması durumunda eğer base bir templatede var ise bomboş bir sayfa render edilebilir 🙂
Son olarak cookies sayfasına da göz atacak olursak
Sonuç.
Django flatpages uygulaması ile girişte bahsettiğimiz gereksinimlere güzel bir çözüm sunuyor ve batteries included(pilleri içinde) web framework tanımının altını doldurmaya devam ediyor. Django’yu seviyor ve kullanıyoruz! 💚
Flatpage uygulaması hakkında daha fazla bilgi almak isterseniz dökümantasyon linki burada.
Bir sonraki yazıda görüşmek dileğiyle!
İlk Yorumu Siz Yapın