Django ile web uygulamaları geliştirmeye başlayanların eski alışkanlıkları sebebiyle yaptıkları bazı hatalar var. Birkaçını zamanında ben de yapmıştım ve ceremesini de çekmiştim. Rama Vadakattu’nun yazdıklarına küçük birkaç ek ile aşağıda bulabilirsiniz. StackOverflow‘da sürekli güncellenen bir liste de mevcut.
Proje adını import satırına yazmayın
Varsayalım ki proje3 içinde xyz isimli bir uygulamanız var, bu durumda aşağıdaki gibi import etmekten sakının:
1
| |
Böyle yazdığınızda import ettiğiniz modül isimleri proje adına bağımlı kalır ve uygulamanız tekrar kullanılabiliir olmaz, ayrıca ileride proje adını değiştirmek istediğinizde tekrar adlandırmayı zorlaştırır.
Doğru kullanım:
1
| |
Bu yazım şeklini projeniz python path’inde olduğu sürece kullanabilirsiniz.
MEDIA_ROOT ve TEMPLATE_DIRS değişkenlerini hardcode etmeyin
settings.py dosyanızda MEDIA_ROOT ve TEMPLATE_DIRS gibi değişkenlerinizi hardcode etmeyin.
1 2 | |
Bu kullanım projenizi sunucular arasında taşırken ya da geliştirme ortamından üretim ortamına taşırken sorun oluşturabilir, bunun yanında farklı platformlarla çalışırken de sorun çıkaracaktır.
Aşağıdaki şekilde kullanırsanız bu sorunların önüne geçebilirsiniz:
1 2 3 | |
Template içinde statik dosyaları hardcode etmeyin
Template içinde kullandığınız statik dosyaları (javascript, css, resim vb.) aşağıdaki gibi kullanmayın:
(MEDIA_URL’in “/appmedia/” olduğunu varsayalım)
1 2 | |
Bu kullanımın sorun teşkil ettiği durumlardan biri de statik dosyaları farklı bir sunucuda ya da serviste barındırmak istediğinizde ortaya çıkıyor. Örneğin statik dosyaları sunarken Amazon S3 kullanmak istediniz ve sunucunuzun adresi cdn.xyz.com, bu durumda websiteniz.com/appmedia altında aranacak olan statik dosyaların her biri için bu tanımlamaları değiştirmeniz gerekecek.
Bu sorunun önüne geçmek için ise {{ MEDIA_URL }} etiketini aşağıdaki şekilde kullanabilirsiniz:
1 2 | |
Tek yapmanız gereken MEDIA_URL değişkeninizi “/appmedia/” yerine “http://cdn.xyz.com/” şeklinde yazmak olacaktır.
Temel işlemleri views içinde yapmayın
Modelleriniz ile ilgili temel işlemleri (model instance’a özgü işlemler) views içinde yapmak pek de güzel bir fikir değildir. Çünkü kodu tekrar kullanamadığınız gibi unit testlerini de yazamazsınız.
Bunun yerine models altında yer vermek ya da yardımcı fonksiyonlar tanımlamak daha iyi bir fikirdir. Hatta her model instance üzerinde yapılacak işlemler için o model’e kendine özgü bir manager yazmak daha da iyidir.
Peki views içinde ne olacak diyorsanız onu da açıklayayım. ORM ile bir nesneyi ya da nesne listesini elde etmek için ya da template içinde kullanılan bir listeyi oluşturmak için kullandığınız işlemleri yazacaksınız.
Geliştirme ve üretim ortamları için farklı ayar dosyası
İki ortam arasında uygulama taşırken DEBUG değişkeni gibi ortama özgü değişkenleri değiştirmekten yorulmuş olabilirsiniz. Genel kanı ortama özgü ayar dosyaları oluşturup mantıksal bir sorguya göre ortama uygun dosyayı import etmektir.
1 2 3 4 5 | |
Bunun birkaç farklı yöntemi olmasına karşın benim kullandığım aşağıdaki yöntemi yazacağım. Ortam bağımlı değişkenleri her ortam için farklı bir settings dosyası (settings_production.py ve settings_development.py) oluşturup içine yazıyoruz. Daha sonra aşağıdaki şekilde import ediyoruz:
1 2 3 4 5 | |
3. parti uygulamaların template etiketlerini tek seferde yükleyin
Başka geliştiriciler tarafından yazılan uygulamaların template etiketlerini aşağıdaki şekilde kullanıyoruz:
1
| |
Bu satırı etiketleri kullandığımız her template’e yazmak hem DRY prensibini bozuyor hem de fazla efor gerektiriyor. Bunun yerine aşağıdaki şekilde kullanıldığında tek yerden yönetilebiliyor ve bizi fazla efor sarf etmekten kurtarıyor. Bu kodu uygulama çalışırken yüklenen herhangi bir dosyaya (settings.py, urls.py vb.) yazabilirsiniz.
1 2 | |
Böylece her template’de {% load %} etiketini kullanmaksızın işlevlerinden faydalanabilirsiniz.
Bütün URL’leri urls.py içine yazmayın
Aşağıdaki urls.py istemediğimiz bir örnek:
1 2 3 4 5 6 7 | |
Bunun yerine her uygulamanın url’lerini o uygulamaya ait urls.py dosyasına (uygulama/urls.py) yazın ve projenin urls.py’sinde import edin.
1 2 3 4 | |
1 2 3 4 5 | |
URL’leri tanımlamak için isim verin
Fark ettiğiniz üzere her bir url için name=… gibi bir isim belirledik. Bu isimlendirme template, view ve modellerde URL’leri hardcode etmeden kullanmamızı sağlıyor. Bu sayede URL yapısını değiştirmek istediğiniz zaman template, view ve modelleri tekrar düzenlemek zorunda değilsiniz.
İsimlendirmede dikkat edilecek bir husus bu isimlerin tekil (unique) olması gerektiği. Bunu sağlamak için
Kullanımına göz atmak isterseniz:
1 2 3 | |
1 2 3 | |
1
| |
Hata ayıklama
En basit yöntemlerden bir tanesi diğer bir çok djangonaut gibi django debug toolbar kullanmaktır. Bu araç sayesinde kaç sql sorgusu ne kadar sürede çalıştırıldı, template adı, logging, cookie ve session bilgisi gibi bilgilere erişebilirsiniz.
Bir diğer yöntem de pdb kullanmak olabilir. Eric Holscher tarafından hazırlanan screencast‘e göz atmak isteyebilirsiniz.
Projenizi zenginleştirin
Bir uygulamaya ihtiyacınız varsa önce internette arama yapmayı deneyin, büyük ihtimalle sizden önce bir başkasına da lazım olmuştur. Dolayısıyla aynı işi yapan uygulamayı hazır bir şekilde bulmanız mümkündür. Aşağıda en çok kullanılan uygulamalardan oluşan küçük bir liste var.
- Pinax - Bir çok temel uygulamayı içinde bulunduran bir proje.
- South - Model değişikliklerini kolayca yönetmenizi sağlayan bir proje.
- django-command-extensions - manage.py komutlarını genişletmeyi amaçlayan bir proje.
- django-compressor - JS ve CSS dosyalarınızı sıkıştırarak tek dosya olarak sunmayı sağlayan bir uygulama.
- django-tastypie - Kolayca RESTful API oluşturmanızı sağlayan bir uygulama.
- django-reversion - Modelleriniz üzerinde sürüm kontrol yetenekleri sağlayan bir uygulama.
- django-social-auth - Sosyal ağlarla kullanıcı yetkilendirmesini sağlayan bir uygulama.
virtualenv kullanın
Projenizi geliştirirken bağımlılıkları yönetmek için sisteminizden izole bir ortam oluşturun. Deployment ve geliştirme aşamasında size bir çok kolaylık sağlayacağı gibi uygulamanızı dağıtmaya karar verirseniz diğer geliştiricilerin de işini kolaylaştıracaktır. Başlangıç için küçük bir yazıyı daha önce yazmıştım, göz atabilirsiniz.