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:
elmadev
klasörünün isminimain
olarak değiştirin.- Proje dosyalarında hâlâ
elmadev
olarak geçen yollarımain
ile 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:
settings.py
dosyaları
3. Farklı geliştirme ortamları için farklı 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
.
-
main
klasörü içerisindekisettings.py
dosyasınıbase.py
olarak isimlendirin. -
main
klasöründesettings
isminde bir klasör oluşturun vebase.py
dosyasını içine taşıyın.__init__.py
dosyasını oluşturmayı da unutmayın. -
development.py
isminde 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 = True
satırı gibi. -
asgi.py
vewsgi.py
dosyaları içindekimain.settings
yolunumain.settings.base
olarak değiştirin. -
Örneğin geliştirme için kullandığınız virtual environment içerisinde
DJANGO_SETTINGS_MODULE = 'main.settings.development
değişken tanımlaması yaparsanız, Django bu env içerisindeyken artıkdevelopment
modülünü kullanır.
requirements.txt
dosyaları:
4. Farklı 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.