Django 6.0’daki Yeni Özellikler
(adamj.eu)- 20 yıldan uzun bir geçmişe sahip Django 6.0, şablonlar, arka plan görevleri, güvenlik, e-posta gibi kritik alanlarda kapsamlı iyileştirmeler yapan büyük bir sürümdür
- Template partials özelliğiyle şablon içindeki kodun yeniden kullanımı kolaylaşıyor ve htmx gibi araçlarla entegrasyon güçleniyor
- Tasks framework eklendi; HTTP istek-yanıt döngüsünün dışında arka plan görevleri çalıştırılabiliyor
- Content Security Policy (CSP) çekirdeğe dahil edildiği için XSS gibi içerik enjeksiyonu saldırılarına karşı koruma kolaylaştı
- E-posta API modernizasyonu, ORM geliştirmeleri ve varsayılan anahtar genişletmesiyle geliştirici deneyimi ve ölçeklenebilirlik belirgin biçimde arttı
Django 6.0 Genel Bakış
- Django 6.0, Python web çerçevesinin yeni bir sürümü ve 20 yıllık gelişimin devamıdır
- Başlıca değişiklikler; şablonlar, arka plan görevleri, güvenlik ve e-posta işleme olmak üzere dört temel alana odaklanır
- Resmi sürüm notlarında derlenen ana iyileştirmeler, toplulukta çok sayıda katkıcının katılımıyla hazırlanmıştır
django-upgrade aracı
- Mevcut projeleri Django 5.2 ve altı sürümlerden yükseltirken django-upgrade aracıyla kodu otomatik dönüştürebilirsiniz
- Django 6.0 için dahil edilen 5 otomatik düzeltici (fixer) vardır ve bazı uyarılar otomatik olarak çözülür
Template partials
- Şablon içinde parça tanımlama (
{% partialdef %}) işlevi eklendi; bu da kod tekrarını azaltıp yeniden kullanımı kolaylaştırır- Aynı şablonda tanımlanan bir partial birden çok kez çağrılabilir
inlineseçeneğiyle tanımlama sırasında render yapmak mümkündür
- Kısmi render ile yalnızca belirli bir partial bağımsız olarak render edilebilir
- Örnekte, htmx kullanılarak
view_countbölümü periyodik olarak güncellenir - URL’ye
#partial_nameeklenerek yalnızca ilgili bölüm render edilebilir
- Örnekte, htmx kullanılarak
- Bu özellik, Google Summer of Code projesi aracılığıyla Django’ya entegre edilmiş ve önceki
django-template-partialspaketinden evrilmiştir
Tasks framework
- Django’ya yeni bir arka plan görevlerini çalıştırma framework’ü eklendi
- HTTP istek-yanıt döngüsünün dışında kod çalıştırılabilir
- E-posta gönderimi, veri işleme, rapor üretimi gibi asenkron görevlerde kullanılabilir
- Görevler
@taskdekoratörü ile tanımlanır,Task.enqueue()ile kuyruğa eklenir - Varsayılan backend’ler; geliştirme için
ImmediateBackendveDummyBackendolmak üzere iki tanedir ve
django-tasks paketindekiDatabaseBackendile SQL DB tabanlı çalıştırma yapılabilir db_workerkomutuyla işçi başlatılır ve günlükler aracılığıyla durum doğrulanabilir- Bu özellik, Wagtail’de doğan fikir doğrultusunda, DEP 0014 önerisinin ardından Django’ya entegre edilmiştir
Content Security Policy(CSP) desteği
- Django 6.0, CSP standardını yerleşik olarak destekleyerek XSS gibi içerik enjeksiyonu saldırılarına karşı savunmayı güçlendirir
ContentSecurityPolicyMiddleware’iMIDDLEWARE’e ekleyerek etkinleştirinSECURE_CSP,SECURE_CSP_REPORT_ONLYayarlarıyla politika yapılandırılabilir
- Nonce tabanlı güvenlik yerleşiktir ve
<script>ve<style>etiketlerinenonce="{{ csp_nonce }}"özniteliği eklenebilir- Her istek için rastgele bir nonce üretilir ve yalnızca güvenilir kaynaklar çalıştırılır
- CSP, 2004’te önerildikten sonra
django-csppaketiyle uygulanmış, bu sürümde ise resmi olarak çekirdeğe alınmıştır
E-posta API güncellemesi
- Django’nun e-posta işleme mantığı Python 3.6’nın modern e-posta API’sine taşındı
- Dahili olarak
email.message.EmailMessagesınıfını kullanır - Mevcut
send_mail()veEmailMessagearayüzleri korunmuştur
- Dahili olarak
- Yeni API, daha az hata, güvenliğin artışı ve satır içi ek ekleri iyileştirme gibi avantajlar sunar
MIMEPartnesnesiyle HTML içeriğine görsel gibi satır içi ekler kolayca eklenebilir- Bu değişiklik 2024’te önerildi ve 8 aylık geliştirme sonunda birleştirildi
E-posta API’sinde konumsal argüman sınırlaması
django.core.mailAPI’sinde bazı parametreler yalnızca anahtar kelime argümanı olarak kabul edilirfail_silentlygibi opsiyonel argümanlar konumsal argüman olarak iletilirse uyarı üretilir- Bu hamle okunabilirlik ve sürdürülebilirliği artırmak için yapılmıştır
django-upgradearacındakimail_api_kwargsfixer ile otomatik olarak düzeltilebilir
Shell otomatik import genişletmesi
- Django 5.2’deki otomatik model import özelliği genişletildi;
settings,connection,models,functions,timezonegibi öğeler otomatik olarak import ediliyor ./manage.py shell -v 2komutuyla otomatik import edilenler listelenebilir- Geliştirici rahatlığı artar ve tekrarlayan kod azaltılmış olur
ORM geliştirmesi: save() sonrası dinamik alan güncellemesi
GeneratedFieldveya ifade tabanlı alanlarsave()sonrasında otomatik güncellenirRETURNINGifadesini destekleyen DB’lerde (SQLite, PostgreSQL, Oracle) anında yansır- MySQL ve MariaDB’de gecikmeli yükleme ile otomatik güncelleme yapılır
- Ek sorgu olmadan en son değerleri doğrudan kullanabilmek verimliliği artırır
Evrensel StringAgg aggregate işlevi
StringAggaggregate fonksiyonu artık tüm veritabanı backendlerinde kullanılabiliyor- Giriş değerlerini ayırıcı (
delimiter) ile birleştirilen bir string döner - PostgreSQL’e özgü bir işlevken artık
django.db.modelsiçinde doğrudan kullanılabiliyor
- Giriş değerlerini ayırıcı (
Value()ifadesiyle ayırıcı belirtilebilir
BigAutoField’ı varsayılanlaştırma
DEFAULT_AUTO_FIELDdeğeriBigAutoFieldolarak değiştirildi- 64 bit tamsayı türü birincil anahtar kullanarak Primary Key tükenmesi sorunu önlenir
- Yeni projelerde ekstra ayar olmadan otomatik olarak uygulanır
- Django 3.2’de getirilen ayar, böylece kolaylaştırılarak boilerplate azaltıldı
Şablon iyileştirmeleri
forloop.lengthdeğişkeni eklendi; döngüde toplam uzunluğa erişilebilir{{ forloop.counter }}/{{ forloop.length }}biçiminde kullanılır
querystringşablon etiketleri iyileştirildi- Boş mapping verildiğinde
?otomatik eklenerek link davranışı tutarlılaştırıldı - Çoklu mapping argümanı birleştirme desteklenerek sorgu parametrelerini birleştirmek kolaylaştı
- Boş mapping verildiğinde
Sonuç
- Django 6.0’a 174 katkıcı katıldı ve
çok sayıda optimizasyon ile hata düzeltmesi içeriyor - Yükseltme, genel olarak güvenlik, sürdürülebilirlik ve geliştirici deneyimi (DX) açısından iyileştirme sağlıyor
- Ek değişiklikler için resmi sürüm notlarına bakılabilir
1 yorum
Hacker News görüşleri
Şirkette birkaç yıldır Django’yu aralıklı olarak kullanıyorum. Genel olarak hoşuma gidiyor ama ORM hâlâ zor geliyor
Django görüşü güçlü bir framework olduğu için, “Django usulünü” takip etmek gerektiğini ancak şimdi tam olarak anladım.
Sorun şu ki farklı iş birimlerinin çoklu veritabanlarını yönetmem gerekiyor; bu yüzden her seferinde onların kendine özgü yapısına uyum sağlamakla uğraşıyorum.
Sonunda
managedseçeneğini kapatıp şemayıinspectdbile içe aktarıyor, ardından web’de görünmesini istemediğim tabloları elle siliyorum.Yeni geliştirilen web uygulamaları için Django hâlâ en iyi tercih
Django, şema durumunu kodla birlikte saklamadığı için DB komutları her çalıştırıldığında mevcut durumu tahmin etmek zorunda kalıyor.
Veritabanı durumunu model koduyla tanımlamanın doğasında sınırlamalar var.
Ben Rails’teki gibi migration’ları açık DB komutlarıyla kurup modeli onun üzerine oturtan yaklaşımı daha çok seviyorum
Manager arayüzü ilk başta kafa karıştırıyor ama migration aracı gerçekten harika
Böylece hem SQL tuning esnekliğini hem de Django’nun rahatlığını birlikte elde ediyorsunuz.
Yalnız bunları migration script’lerinin içinde oluşturmayı unutmamak gerekiyor
Django’nun her sürümde biraz daha istikrarlı şekilde gelişmesi gerçekten çok hoşuma gidiyor.
Özellikle 6.0 sürümü faydalı özelliklerle dolu olduğu için ilgi çekici.
Güvenilir teknolojinin sıkıcı olduğu iddiası yanlış. Doğru gelişim tam da böyle olur
Şu anda Django’nun doğduğu yere yakın yaşıyorum.
Bu arada dünden beri iş arıyorum; tecrübeli bir Django geliştiricisi arıyorsanız ulaşın (oldspiceap@gmail.com)
Adam’ın yazdığı kodlar ve blog yazıları her zaman okumaya değer.
tasks framework’ünün bundan sonra nasıl gelişeceğini merak ediyorum.
Yalnız harika Django-Q2’nin Celery ile birlikte anılması biraz üzücü
Hataları çok ama kullanıcı tabanı o kadar büyük ki bir sorunla ilk kez karşılaşan kişi olmanız nadir.
Celery + RabbitMQ ile günde on milyonlarca mesajı sorunsuz işledim.
Hâlâ ilk bakılması gereken çözüm
Başka stack’lerde Kafka da kullanıyorum ama o tamamen farklı ölçekte kullanım senaryoları için
Django’yu yaklaşık 5-6 yıldır kullanıyorum; “batteries included” avantajı açık ama genel olarak ağır hissettiriyor
Template partial özelliği güzel görünüyor.
React’in popüler olmasının nedenlerinden biri kodun yeniden kullanılabilirliği ve sanki Django da o yöne gidiyor
Örnek için şuradaki koda bakabilirsiniz
Ben daha çok Odoo kullanıyorum ama Django ve Celery ile de biraz çalıştım.
Odoo’nun OCA queue modülünü yoğun kullanan biri olarak,
Django’nun neden Postgres LISTEN/NOTIFY özelliğinden yararlanmadığını hep merak etmişimdir.
Muhtemelen Django ekosistemine yeterince aşina olmadığım içindir
Template Partials ve HTMX, Django’nun Rails View Components + Stimulus versiyonu gibi hissettiriyor.
Tasks özelliğinin resmi olarak desteklenmesi de sevindirici
Django’yu 1.x döneminde, ORM’nin olmadığı zamanlardan beri kullanıyorum.
Task çalıştırma özelliğinin ancak şimdi eklenmiş olması gerçekten şaşırtıcı.
Bunu eleştiri olarak söylemiyorum; sadece ilginç bir evrim
Her özelliği yeterince olgunlaştıktan sonra dahil eder ve LTS ile API kararlılığına odaklanır.
Bu sayede yeni sürüm çıktığında tüm uygulamayı baştan yazmak neredeyse hiç gerekmez
O zamanlar daha basitti ama oldukça uzun süre raw SQL kullanmaya gerek kalmadı
Ek tartışma bu başlıkta sürüyor
Django ve HTMX’i birlikte kullanırken bileşen bazlı template’ler çok rahatsız edici geldiği için,
Python tabanlı bir bileşen kütüphanesi olan Compone’u kendim yaptım.
Yalnızca Django’da değil, tüm Python web framework’lerinde kullanılabiliyor ve çok daha konforlu bir geliştirme deneyimi sunuyor