Django projesi çalışma dizini yapısı için en iyi uygulama


175

Aslında tek bir doğru yol olmadığını biliyorum. Ancak, iyi çalışan ve her geliştirici ve yönetici için temiz kalan bir dizin yapısı oluşturmanın zor olduğunu gördüm. Github'daki çoğu projede bazı standart yapılar vardır. Ama pc başka bir dosya ve tüm projeleri düzenlemek için bir yol göstermez.

Tüm bu dizinleri geliştirme makinesinde organize etmenin en uygun yolu nedir? Onları nasıl adlandırıyorsunuz ve bunu sunucuya nasıl bağlayıp dağıtıyorsunuz?

  • projeler (üzerinde çalıştığınız tüm projeler)
  • kaynak dosyalar (uygulamanın kendisi)
  • deponun çalışma kopyası (git kullanıyorum)
  • sanal ortam (bunu projenin yakınına koymayı tercih ederim)
  • statik kök (derlenmiş statik dosyalar için)
  • ortam kökü (yüklenen ortam dosyaları için)
  • BENİOKU
  • LİSANS
  • evraklar
  • skeçler
  • örnekler (bu proje tarafından sağlanan uygulamayı kullanan örnek bir proje)
  • veritabanı (sqlite kullanılması durumunda)
  • proje üzerinde başarılı bir çalışma için genellikle ihtiyacınız olan her şey

Çözmek istediğim sorunlar:

  • Dizinlerin iyi isimleri böylece amaçları açıktır.
  • Tüm proje dosyalarını (virtualenv dahil) tek bir yerde tutarak, kolayca tüm projeyi kopyalayabilir, taşıyabilir, arşivleyebilir, kaldırabilir veya disk alanı kullanımını tahmin edebilirim.
  • Klonlamak istemediğim başka bir dosyanın tek bir kopyasını tutarken, tüm uygulama, depo veya virtualenv gibi bazı seçilmiş dosya kümelerinin birden çok kopyasını oluşturma.
  • Seçili bir dizini rsyncing yaparak sunucuya doğru dosya kümesini dağıtma.

Yanıtlar:


257

Benim ~/projects/dizinde var Django "projeler" iki tür vardır , her ikisi de biraz farklı bir yapıya sahip .:

  • Bağımsız web siteleri
  • Takılabilir uygulamalar

Bağımsız web sitesi

Çoğunlukla özel projeler, ama olmak zorunda değil. Genellikle şöyle görünür:

~/projects/project_name/

docs/               # documentation
scripts/
  manage.py         # installed to PATH via setup.py
project_name/       # project dir (the one which django-admin.py creates)
  apps/             # project-specific applications
    accounts/       # most frequent app, with custom user model
    __init__.py
    ...
  settings/         # settings for different environments, see below
    __init__.py
    production.py
    development.py
    ...

  __init__.py       # contains project version
  urls.py
  wsgi.py
static/             # site-specific static files
templates/          # site-specific templates
tests/              # site-specific tests (mostly in-browser ones)
tmp/                # excluded from git
setup.py
requirements.txt
requirements_dev.txt
pytest.ini
...

Ayarlar

Ana ayarlar üretim ayarlarıdır. Diğer dosyalar (örn. staging.py, development.py) Her şeyi içe aktarır production.pyve yalnızca gerekli değişkenleri geçersiz kılar.

Her ortam için ayrı ayar dosyaları vardır, örn. üretim, geliştirme. Ben de bazı test (test koşucusu için), evreleme (son dağıtım öncesi bir kontrol olarak) ve heroku (heroku dağıtımı için) ayarları var.

Gereksinimler

Daha çok setup.py dosyasındaki gereksinimleri doğrudan belirtiyorum. Sadece içinde bulunduğum geliştirme / test ortamı için gerekli olanlar requirements_dev.txt.

Bazı hizmetlerin (örn. Heroku) requirements.txtkök dizinde olması gerekir .

setup.py

Kullanarak projeyi dağıtırken kullanışlıdır setuptools. Bu ekler manage.pyiçin PATHben çalışabilmesi için, manage.pydoğrudan (her yerde).

Projeye özgü uygulamalar

Bu uygulamaları project_name/apps/dizine koyar ve göreli içe aktarmalar kullanarak içe aktarırdım.

Şablonlar / statik / yerel / sınama dosyaları

Bu şablonları ve statik dosyaları, her uygulamanın içinde değil, global şablonlara / statik dizine koydum. Bu dosyalar genellikle proje kodu yapısını veya python'u umursamayan kişiler tarafından düzenlenir. Tek başına veya küçük bir ekipte çalışan tam yığın geliştiriciyseniz, uygulama başına şablonlar / statik dizin oluşturabilirsiniz. Gerçekten sadece bir tat meselesi.

Aynısı yerel ayar için de geçerlidir, ancak bazen ayrı yerel ayar dizini oluşturmak uygun olur.

Testler genellikle her uygulamanın içine yerleştirilmek için daha iyidir, ancak genellikle birlikte çalışan daha fazla uygulamayı test eden birçok entegrasyon / fonksiyonel test vardır, bu nedenle küresel testler dizini mantıklıdır.

TMP Dizini

Proje kökünde VCS dışında bırakılan geçici bir dizin vardır. Geliştirme sırasında medya / statik dosyaları ve sqlite veritabanını depolamak için kullanılır. Tmp içindeki her şey sorunsuz bir şekilde silinebilir.

virtualenv

virtualenvwrapperTüm vivleri ~/.venvsdizine tercih ederim ve bir tmp/arada tutmak için içine yerleştirebilirsiniz .

Proje şablonu

Bu kurulum için proje şablonu oluşturdum, django-start-template

yayılma

Bu projenin dağıtımı şu şekildedir:

source $VENV/bin/activate
export DJANGO_SETTINGS_MODULE=project_name.settings.production
git pull
pip install -r requirements.txt

# Update database, static files, locales
manage.py syncdb  --noinput
manage.py migrate
manage.py collectstatic --noinput
manage.py makemessages -a
manage.py compilemessages

# restart wsgi
touch project_name/wsgi.py

Bunun rsyncyerine kullanabilirsiniz git, ancak yine de ortamınızı güncellemek için bir dizi komut çalıştırmanız gerekir.

Son zamanlarda, [django-deploy][2]ortamı güncellemek için tek yönetim komutunu çalıştırmamı sağlayan bir uygulama yaptım , ancak bunu sadece bir proje için kullandım ve hala deniyorum.

Eskizler ve taslaklar

Genel templates/dizinin içine yerleştirdiğim şablon taslağı . Sanırım biri sketches/proje kökünde klasör oluşturabilir , ancak henüz kullanmadım.

Takılabilir uygulama

Bu uygulamalar genellikle açık kaynak olarak yayınlanmaya hazırlanır. Aşağıda django-forme'den örnek aldım

~/projects/django-app/

docs/
app/
tests/
example_project/
LICENCE
MANIFEST.in
README.md
setup.py
pytest.ini
tox.ini
.travis.yml
...

Dizinlerin adı açıktır (umarım). Test dosyalarını uygulama dizininin dışına koydum, ama gerçekten önemli değil. Sağlanması önemlidir READMEve setup.pybu nedenle paket kolayca kurulabilir pip.


Teşekkür ederim! Yapınızı seviyorum. Bana faydalı fikirler verdi. Gereksinimler için setup.py'yi kullanma ve manage.py dosyasını PATH'e yükleme hakkında iyi noktalar. Lütfen son şeyi nasıl yaptığını gösterebilir misin? Ayrıca 'tmp' dir hakkında iyi bir nokta. Bunu 'yerel' olarak adlandırmayı tercih ederim, o zaman 'env', 'tmp' ve içinde bir şey olabilir. Bu, gitignore ile çok fazla anlaşma yapma sorununu çözer. Yeni bir sorun, bu adın "yerel ayar" a çok yakın olmasıdır. Belki de 'locale'i' project_name 'çekirdek uygulamasına taşımak mantıklıdır, emin değilim. Sadece kötü isim yüzünden yapıyı değiştirmek istemiyorum. Baska öneri?
raacer

Setup.py kullanırken, scriptsanahtar kelime argümanı ekleyin : github.com/elvard/django-start-template/blob/master/project/… Seviyorum tmpçünkü her zaman kaldırılabilen "geçici bir şey" önerir. Toplevel localedir gerekli değildir, herhangi bir yere yerleştirebilirsiniz. Statik / şablonlar dirs ile tutarlı olmasını seviyorum.
Tomáš Ehrlich

Başka dosyaları kopyalamadan kaynak dosyaların birkaç kopyasını alma gereksinimim doğrudan çözülmedi. Ancak hedef git checkout, proje dizinini kopyalarken yalnızca bir dir 'tmp' kullanarak veya hariç tutarak arşivlenebilir . Yani yapınız tüm gereksinimleri karşılıyor gibi görünüyor ve şüphesiz düzenli olarak kullanmak için yeterince açık. Cevabınızı kabul ediyorum. Teşekkür ederim.
raacer

Teşekkür ederim. "Başka dosyaları kopyalamadan kaynak dosyaların birkaç kopyasını oluşturma yeteneği" ile ne demek istediğinizi hala anlamıyorum. Twsed rsync komutu yapardı, ama muhtemelen demek istediğin bu değil ...
Tomáš Ehrlich

Genellikle srcproje kökünün içinde dir oluştururum . Bu, kaynak dosyaların ve git depo kökünün çalışan kopyasıdır. - Bu dizinin birkaç kopya yapabilir src, src.bak, src_tmpve bu kadar. Gibi diğer non-Repo dirs env, tmp, media, backupaynı seviyede huzurunuzda. Bu yüzden cp -r src src.bakgit ile biraz deneme yapmak veya sürümleri harici araçla karşılaştırmak istediğim zaman yapabilirim . Deponuzun içinde yerel dosyalarınız olsa da, yerel dosya dizinimin içinde depo var (tam tersi). srcDirimin en iyi adı repo.
raacer

19

Cevabım, kendi çalışma deneyimimden ve çoğunlukla Django'nun İki Kepçe kitabından ilham aldım ve her şeyin daha ayrıntılı bir açıklamasını bulabileceğiniz yer. Sadece bazı noktalara cevap vereceğim ve herhangi bir iyileştirme veya düzeltme memnuniyetle karşılanacaktır. Ancak aynı amaca ulaşmak için daha doğru tavırlar da olabilir.

Projeler
Kişisel dizinim üzerinde üzerinde çalıştığım tüm projeleri koruduğum bir ana klasör var.

Kaynak Dosyalar
Ben şahsen django proje kökünü projelerimin depo kökü olarak kullanıyorum. Ancak kitapta her iki şeyi de ayırmanız önerilir. Bunun daha iyi bir yaklaşım olduğunu düşünüyorum, bu yüzden projelerimde aşamalı olarak değişiklik yapmaya başlamayı umuyorum.

project_repository_folder/
    .gitignore
    Makefile
    LICENSE.rst
    docs/
    README.rst
    requirements.txt
    project_folder/
        manage.py
        media/
        app-1/
        app-2/
        ...
        app-n/
        static/
        templates/
        project/
            __init__.py
            settings/
                __init__.py
                base.py
                dev.py
                local.py
                test.py
                production.py
            ulrs.py
            wsgi.py

Depo
Git veya Mercurial, Django geliştiricileri arasında en popüler sürüm kontrol sistemleri gibi görünüyor. Ve GitHub ve Bitbucket yedeklemeleri için en popüler barındırma hizmetleri .

Sanal Ortam
Virtualenv ve virtualenvwrapper kullanıyorum. İkincisini kurduktan sonra, çalışma dizininizi ayarlamanız gerekir. Benimki, sanal ev kurulum kılavuzunda tavsiye edildiği gibi benim / home / envs dizinimde . Ama en önemli şeyin nerede olduğu olduğunu düşünmüyorum. Sanal ortamlarla çalışırken en önemli şey gereksinim.txt dosyasını güncel tutmaktır.

pip freeze -l > requirements.txt 

Statik Kök
Proje klasörü

Medya Kökü
Projesi klasörü

README
Havuz kökü

LİSANS
Havuz kökü

Belgeler
Havuz kökü. Bu python paketleri, belgelerinizi daha kolay yönetmenize yardımcı olabilir:

Skeçler

Örnekler

Veri tabanı


Deneyiminizi paylaştığınız için teşekkür ederiz. Yapınızda çok sayıda 'proje *' dizini var. Muhtemelen böyle isimleri gerçek hayatta kullanmıyorsunuz değil mi? Diyelim ki bir 'yapılacak' projemiz var. Böyle bir durumda bu direkler nasıl adlandırılır? Mevcut yapınızda gördüğüm sorun, depoyu depo olmayan dosyalarla (yukarıda belirtildiği gibi) karıştırmaktır. .Gitignore'a herhangi bir çöp eklemek can sıkıcı olabilir, değil mi? Başka bir şüpheli şey, env dir'yi projenin kendisinden uzak tutmaktır. Mantıklı geliyor? Neden ~ / docs, ~ / statics vb. Git bile kaynak dosyaların yanında oturmayı sever.
raacer

Onları şöyle adlandırırım: "todo_project" -> todo -> todo (veya belki todoapp). Ben dizin dizin hiyerarşisinin kökünde depo klasörü olmak önemli olduğunu düşünüyorum. Ama, sadece benim düşüncem. Ortam dizini hakkında, üretim ortamını ayarlamanız gerektiğinde, şunu yazmanız yeterlidir: pip install -U -r gereksinimleri.txt. Ama dediğim gibi, her şey için tek bir çözüm yok.
cor

Yani ana app yolu "projeler / todo_project / todo / todo". Kelime "projeler" iki kez tekrarlanır ve "todo" kelime üç kez tekrarlanır. Bu "projeler / proje / projem / proje_dir / proje / proje" gibi görünüyor. İsimler çok belirsiz. Bu benim dizin yapısında çözmeye çalıştığım önemli sorunlardan biri. Hiyerarşiyi anlamayı kolaylaştırmak için dizinleri adlandırmak istiyorum. Depo kökü hakkında ne düşünüyorsunuz, bunun neden önemli olduğunu açıklar mısınız? Ayrıca, env'leri ana proje direktifinin dışında tutmanın iyi olduğunu açıklayabilir misiniz?
raacer

13

Yeni bir settings/dizin oluşturmak istemiyorum . Ben sadece adlı dosyaları eklemek settings_dev.pyve settings_production.pyböylece düzenlemek zorunda değilsiniz BASE_DIR. Aşağıdaki yaklaşım, varsayılan yapıyı değiştirmek yerine arttırmaktadır.

mysite/                   # Project
    conf/
        locale/
            en_US/
            fr_FR/
            it_IT/
    mysite/
        __init__.py
        settings.py
        settings_dev.py
        settings_production.py
        urls.py
        wsgi.py
    static/
        admin/
            css/           # Custom back end styles
        css/               # Project front end styles
        fonts/
        images/
        js/
        sass/
    staticfiles/
    templates/             # Project templates
        includes/
            footer.html
            header.html
        index.html
    myapp/                 # Application
        core/
        migrations/
            __init__.py
        templates/         # Application templates
            myapp/
                index.html
        static/
            myapp/
                js/  
                css/
                images/
        __init__.py
        admin.py
        apps.py
        forms.py
        models.py
        models_foo.py
        models_bar.py
        views.py
    templatetags/          # Application with custom context processors and template tags
        __init__.py
        context_processors.py
        templatetags/
            __init__.py
            templatetag_extras.py
    gulpfile.js
    manage.py
    requirements.txt

Bunu düşünüyorum:

    settings.py
    settings_dev.py
    settings_production.py

bundan daha iyidir:

    settings/__init__.py
    settings/base.py
    settings/dev.py
    settings/production.py

Bu kavram diğer dosyalar için de geçerlidir.


Genellikle node_modules/ve bower_components/varsayılan static/klasör içindeki proje dizinine yerleştiririm .

Bazen vendor/Git Submodules için bir dizin ama genellikle onları static/klasöre yerleştiriyorum.


4

İşte benim sistemimde takip ettiklerim.

  1. Tüm Projeler : Bir yoktur klasör evimde projeler dizini yani ~/projects. Tüm projeler onun içinde.

  2. Bireysel Proje : Bireysel projeler için django-skel adı verilen birçok geliştirici tarafından kullanılan standart bir yapı şablonunu takip ediyorum . Temelde tüm statik dosya ve medya dosyalarınızı ve hepsini ilgilenir.

  3. Sanal ortam : Tüm sanal ortamları sistemde saklamak için evimde bir sanal klasör var~/virtualenvs . Bu bana sahip olduğum tüm sanal ortamları bildiğim ve kolayca kullanabileceğim konusunda esneklik sağlıyor

Yukarıdaki 3 çalışma ortamımın ana bölümleridir.

Bahsettiğiniz diğer tüm bölümler çoğunlukla projeden projeye bağlıdır (yani farklı projeler için farklı veritabanları kullanabilirsiniz). Bu yüzden bireysel projelerinde kalmalılar.


Teşekkür ederim. Havuzu depo olmayan dosyalarla karıştırırken .gitignore öğesine herhangi bir çöp eklemek can sıkıcı olabilir. Değil mi? Bazı projelerimde on ve daha fazla dosya ve dizin var. Başka bir şüpheli şey, env dir'yi projenin kendisinden uzak tutmaktır. Bu çözümdeki esneklik nedir? Neden ~ / docs, ~ / statics vb. Git bile kaynak dosyaların yanında oturmayı sever. Ben esneklik sadece virtualenv dahil olmak üzere tüm proje dizini kopyalamak / taşımak / arşivlemek / kaldırmak ve bir proje içinde birden çok envleri kolayca
koruyabildiğimi düşündüm

4

Django Project Skeleton'a göre, izlenebilecek doğru dizin yapısı:

[projectname]/                  <- project root
├── [projectname]/              <- Django root
   ├── __init__.py
   ├── settings/
      ├── common.py
      ├── development.py
      ├── i18n.py
      ├── __init__.py
      └── production.py
   ├── urls.py
   └── wsgi.py
├── apps/
   └── __init__.py
├── configs/
   ├── apache2_vhost.sample
   └── README
├── doc/
   ├── Makefile
   └── source/
       └── *snap*
├── manage.py
├── README.rst
├── run/
   ├── media/
      └── README
   ├── README
   └── static/
       └── README
├── static/
   └── README
└── templates/
    ├── base.html
    ├── core
       └── login.html
    └── README

En son dizin yapısı için https://django-project-skeleton.readthedocs.io/en/latest/sttruc.html adresine bakın .


7
[Projectname] / [projectname] yaklaşımından nefret ediyorum!)
raacer

1
django-project-skeleton "Django Belgeleri" değildir. "Django-project-skeleton'a göre ..." demek daha doğru olur.
David Winiecki

0

Https://github.com/Mischback/django-project-skeleton deposunu kullanabilirsiniz .

Aşağıdaki komutu çalıştırın:

$ django-admin startproject --template=https://github.com/Mischback/django-project-skeleton/archive/development.zip [projectname]

Yapı böyle bir şeydir:

[projectname]/                  <- project root
├── [projectname]/              <- Django root
   ├── __init__.py
   ├── settings/
      ├── common.py
      ├── development.py
      ├── i18n.py
      ├── __init__.py
      └── production.py
   ├── urls.py
   └── wsgi.py
├── apps/
   └── __init__.py
├── configs/
   ├── apache2_vhost.sample
   └── README
├── doc/
   ├── Makefile
   └── source/
       └── *snap*
├── manage.py
├── README.rst
├── run/
   ├── media/
      └── README
   ├── README
   └── static/
       └── README
├── static/
   └── README
└── templates/
    ├── base.html
    ├── core
       └── login.html
    └── README
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.