En iyi yapı hangisi, net bir şey söylemek mümkün değil ama kontrolü kolay ve anlaşılır bir Django proje yapısı için birkaç öneri verebilirim. Bu yazıda varsayılan Django proje yapısının ötesine basitçe geçmeyi deneyeceğiz. Yeni başlayanlar için faydalı olacaktır.
Not: Tüm örneklerde Django projesinin elmadev isminde bir blog sitesi olduğu varsayılacaktır.
1. Ayrı bir "uygulamalar" klasörü
Bir Django projesinin ana dizininde birden fazla klasör görürsünüz ve bunlar ana proje klasörünün haricinde genelde uygulamaları barındıran klasörlerdir. Her uygulamaya bir klasör. Fakat bunların ana dizinde olmasının gereksiz karmaşık bir görüntü yarattığını düşünüyorum.
Tüm uygulamalarımızı apps isminde bir klasör oluşturup içinde tutabiliriz:
├── apps <---- buraya dikkat
│ ├── __init__.py
│ ├── authors
│ └── posts
├── elmadev
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
settings.py dosyasında apps klasörünü path'e şöyle ekleyebilirsiniz:
sys.path.append(str(BASE_DIR / 'apps'))
Bu şekilde uygulamalardan herhangi bir modül içe aktarmak için her zamanki kullanımla devam edebilirsiniz:
from authors.views import AuthorDetailView
from posts.views import PostDetailView
2. Projenin ana klasörünü farklı isimlendirmek
Django projesinin içindeki ana klasörün projeyle aynı isimde olmasındansa, daha jenerik bir isim kullanmayı doğru buluyorum.
$ django-admin startproject elmadev
Yukarıdaki komut, şöyle bir proje yapısı oluşturacak:
elmadev
├── elmadev # <--- buraya dikkat
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
Bizim istediğimiz yapı ise şöyle:
elmadev
├── main # <--- buraya dikkat
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
Bu değişikliği yeni bir projede yapmak istiyorsanız, sadece aşağıdaki komutla halledebilirsiniz:
$ django-admin startproject main
Ancak önceden oluşturulmuş bir projede yapmak istiyorsanız, yapılacaklar şunlar:
elmadevklasörünün isminimainolarak değiştirin.- Proje dosyalarında hâlâ
elmadevolarak geçen yollarımainile değiştirin:- manage.py:9, wsgi.py:14, asgi.py:14:
elmadev.settings>main.settings - main/settings.py:52:
ROOT_URLCONF = 'elmadev.urls'>ROOT_URLCONF = 'main.urls' - main/settings.py:70:
WSGI_APPLICATION = 'elmadev.wsgi.application'>WSGI_APPLICATION = 'main.wsgi.application'
- manage.py:9, wsgi.py:14, asgi.py:14:
3. Farklı geliştirme ortamları için farklı settings.py dosyaları
Geliştirme, test ve yayın aşamaları için farklı settings.py dosyaları kullanabilirsiniz. Bunun için çok sayıda yöntem var. Burada kolaylıkla anlaşılabilecek bir örnek üzerinden gidelim.
Ana proje klasörümüzün adı bir önceki örnekte değiştirdiğimiz için artık main.
-
mainklasörü içerisindekisettings.pydosyasınıbase.pyolarak isimlendirin. -
mainklasöründesettingsisminde bir klasör oluşturun vebase.pydosyasını içine taşıyın.__init__.pydosyasını oluşturmayı da unutmayın. -
development.pyisminde yeni bir dosya oluşturup içine şu kodları ekleyin:from base import * DEBUG = True # ... -
Geliştirme aşamasında değiştirmek istediğiniz tüm ayarları burada yeniden tanımlayabilirsiniz, tıpkı
DEBUG = Truesatırı gibi. -
asgi.pyvewsgi.pydosyaları içindekimain.settingsyolunumain.settings.baseolarak değiştirin. -
Örneğin geliştirme için kullandığınız virtual environment içerisinde
DJANGO_SETTINGS_MODULE = 'main.settings.developmentdeğişken tanımlaması yaparsanız, Django bu env içerisindeyken artıkdevelopmentmodülünü kullanır.
4. Farklı requirements.txt dosyaları:
Bu dosya, Python bağımlılıkları sakladığımız bir dosya ve bu dosyadan birden fazla oluşturup birbirlerine bağlayabilirsiniz. Örneğin, requirements.txt ve requirements-dev.txt isminde iki dosyamız olsun ve ikincisinin içine şu satırı ekleyerek ilk dosyanın da içeriklerini dahil etmiş olalım:
-r requirements.txt
Bu yöntemle, pip install -r requirements-dev.txt komutunu kullanarak bağımlılıkları yüklediğinizde, requirements.txt dosyasının içerisindeki bağımlılıklar da otomatik olarak yüklenecektir.
Daha birçok öneri eklenebilir ama yazı çok uzadı. Daha sonra eklemeler yapabilirim.