Краща практика для структури робочого каталогу Django


174

Я знаю, що насправді немає єдиного правильного шляху. Однак я виявив, що важко створити структуру каталогів, яка добре працює і залишається чистою для кожного розробника та адміністратора. У більшості проектів на github є якась стандартна структура. Але це не показує спосіб впорядкування інших файлів та всіх проектів на ПК.

Який найзручніший спосіб організувати всі ці каталоги на машині розвитку? Як ви їх називаєте та як це підключити та розгорнути на сервері?

  • проекти (усі проекти, над якими ви працюєте)
  • вихідні файли (сама програма)
  • робоча копія сховища (я використовую git)
  • віртуальне середовище (я вважаю за краще розмістити це біля проекту)
  • статичний корінь (для складених статичних файлів)
  • медіа-корінь (для завантажених медіа-файлів)
  • ЧИТАЙТЕ
  • ЛІЦЕНЗІЯ
  • документи
  • ескізи
  • Приклади (приклад проекту, який використовує додаток, наданий цим проектом)
  • база даних (у разі використання sqlite)
  • все, що вам зазвичай потрібно для успішної роботи над проектом

Проблеми, які я хочу вирішити:

  • Гарні назви каталогів, щоб їх призначення було зрозумілим.
  • Зберігаючи всі файли проекту (включаючи virtualenv) в одному місці, тому я можу легко скопіювати, перемістити, архівувати, видалити весь проект або оцінити використання дискового простору.
  • Створення декількох копій деяких вибраних наборів файлів, таких як ціла програма, сховище або virtualenv, зберігаючи єдину копію інших файлів, які я не хочу клонувати.
  • Розгортання правильного набору файлів на сервері, просто rsyncing вибраного одного dir.

Відповіді:


257

У моєму ~/projects/каталозі є два види "проектів" Джанго , обидва мають дещо іншу структуру.

  • Автономні веб-сайти
  • Підключені програми

Окремий веб-сайт

Переважно приватні проекти, але це не повинно бути. Зазвичай це виглядає так:

~/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
...

Налаштування

Основні параметри - виробничі. Інші файли (напр. staging.py, development.py ) Просто імпортують все, з чогоproduction.py і заміняють лише необхідні змінні.

Для кожного середовища існують окремі файли налаштувань, наприклад. виробництво, розвиток. У деяких проектах у мене є також тестування (для тестового бігуна), постановка (як перевірка перед остаточним розгортанням) та налаштування heroku (для розгортання в heroku).

Вимоги

Я краще вказую вимоги в setup.py безпосередньо. Тільки ті, які потрібні для розробки / тестового середовища, в якому я маю requirements_dev.txt.

Деякі служби (наприклад, heroku) вимагають мати requirements.txtв кореневій директорії.

setup.py

Корисно при використанні проекту setuptools. Це додає manage.pyдо PATH, тому я можу бігати manage.pyбезпосередньо (де завгодно).

Додаткові програми

Я використовував ці програми в project_name/apps/каталог і імпортував їх, використовуючи відносний імпорт.

Шаблони / статичні / локальні / тестові файли

Я розміщую ці шаблони та статичні файли у глобальних шаблонах / статичних каталогах, а не в кожній програмі. Ці файли зазвичай редагують люди, яким взагалі не байдужа структура проекту чи пітон. Якщо ви розробник повних стеків, працюєте окремо або в невеликій команді, ви можете створити шаблони / статичні каталоги на додаток. Це справді лише питання смаку.

Це ж стосується і локальної мови, хоча іноді зручно створювати окремий каталог локалів.

Тести, як правило, краще розміщувати в кожному додатку, але зазвичай є багато інтеграційних / функціональних тестів, які тестують більше додатків, які працюють разом, тому глобальний каталог тестів має сенс.

Довідник Tmp

У корені проекту є тимчасовий каталог, виключений з VCS. Він використовується для зберігання медіа / статичних файлів та бази даних sqlite під час розробки. Все в tmp можна було будь-коли видалити без проблем.

Віртуалєв

Я віддаю перевагу virtualenvwrapperі розміщую всі венузи в ~/.venvsкаталозі, але ви можете розмістити їх всередині, tmp/щоб тримати їх разом.

Шаблон проекту

Я створив шаблон проекту для цієї установки, django-start-template

Розгортання

Розгортання цього проекту наступне:

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

Ви можете використовувати rsyncзамість git, але все ж вам потрібно виконати пакет команд, щоб оновити ваше середовище.

Нещодавно я зробив [django-deploy][2]додаток, що дозволяє мені запускати одну команду управління для оновлення середовища, але я використовував її лише для одного проекту, і я все ще експериментую з ним.

Ескізи та чернетки

Чернетку шаблонів я розміщую всередині глобального templates/каталогу. Я думаю, що можна створити папку sketches/в корені проекту, але ще не використовували її.

Підключений додаток

Зазвичай ці програми готуються до публікації у відкритому коді. Нижче я взяв приклад із django-forme

~/projects/django-app/

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

Назва каталогів зрозуміла (сподіваюся). Я розміщую тестові файли поза каталогом додатків, але це насправді не має значення. Важливо забезпечити READMEі setup.py, щоб пакет легко встановлювався наскрізь pip.


Дякую! Мені подобається ваша структура. Це дало мені корисні ідеї. Хороші моменти щодо використання setup.py для вимог та встановлення Manag.py в PATH. Чи можете ви, будь ласка, показати, як ви робите останнє? Також хороший пункт про "tmp" реж. Я б швидше назвав його "локальним", тоді, можливо, у мене є "env", "tmp" і все що завгодно. Це вирішує проблему занадто багато угод з gitignore. Нова проблема полягає в тому, що ця назва занадто близька до "locale". Можливо, є сенс перемістити "locale" на основну програму "project_name", не впевнений. Просто не хочу змінювати структуру через погану назву. Будь-які пропозиції?
гонщик

Використовуючи setup.py, додайте scriptsаргумент ключового слова: github.com/elvard/django-start-template/blob/master/project/… Мені подобається, tmpтому що він пропонує "щось тимчасове", яке можна видалити будь-коли. Режим Toplevel localeне потрібен. Ви можете розмістити його в будь-якому місці. Мені просто подобається, щоб це відповідало статичним / шаблонам dirs.
Томаш Ерліх

Моя вимога до здатності робити кілька копій вихідних файлів без копіювання інших файлів не вирішується безпосередньо. Але мета все-таки може бути архівована, використовуючи git checkoutабо виключаючи лише один dir 'tmp' під час клонування каталогу проектів. Тож здається, що ваша структура відповідає всім вимогам, і це досить зрозуміло, щоб регулярно користуватися без сумнівів. Я приймаю вашу відповідь. Дякую.
гонщик

Дякую. Я досі не розумію, що ви маєте на увазі під "здатністю робити декілька копій вихідних файлів без копіювання інших файлів". Налаштована команда rsync зробила б, але це, мабуть, не так, що ви маєте на увазі ...
Томаш Ерліх,

Я зазвичай створюю dir srcвсередині кореня проекту. Це робоча копія вихідних файлів та корінь сховища git. Я можу зробити кілька копій цього каталогу - src, src.bak, src_tmpі так далі. Інші пошукові роботи не з'являлися-Репо , як env, tmp, media, backupзнаходяться на тому ж рівні. Тож я можу в будь- cp -r src src.bakякий час, коли хочу зробити якийсь експеримент із git або порівняти версії із зовнішнім інструментом. Поки у вас є локальні файли всередині вашого сховища, у мене є сховище всередині моїх локальних файлів dir (навпаки). Краще ім’я мого srcрежисера repo.
гонщик

19

Моя відповідь натхненна на моєму власному досвіді роботи, і головним чином у книзі « Дві совки Джанго», яку я дуже рекомендую, і де ви можете знайти більш детальне пояснення всього. Я просто відповім на деякі моменти, і будь-яке поліпшення чи виправлення буде вітатися. Але для досягнення тієї ж мети можуть бути і більш правильні манери.

Проекти
У мене в головній папці головна папка, де я підтримую всі проекти, над якими працюю.

Вихідні файли
Я особисто використовую корінь проекту django як корінь сховища моїх проектів. Але в книзі рекомендується розділити обидві речі. Я думаю, що це кращий підхід, тому я сподіваюся почати вносити зміни поступово у свої проекти.

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

Репозиторій
Git або Mercurial , здається, найбільш популярних систем управління версіями серед розробників Django. І найпопулярніші хостинг-сервіси для резервного копіювання GitHub та Bitbucket .

Віртуальне середовище
Я використовую virtualenv та virtualenvwrapper. Встановивши другий, потрібно налаштувати робочий каталог. Шахта знаходиться в моєму каталозі / home / envs , як це рекомендується в посібнику з установки virtualenvwrapper. Але я не думаю, що найголовніше - це місце, де воно розміщене. Найважливіше при роботі з віртуальними середовищами - це актуалізація файлу вимог.txt.

pip freeze -l > requirements.txt 


Папка « Static Root Project»


Папка Project Media Root

README
Корінь сховища


Корінь сховища ЛІЦЕНЗІЇ


Корінь сховища документів . Цей пакет python може допомогти вам легше керувати документацією:

Ескізи

Приклади

База даних


Дякуємо, що поділилися своїм досвідом. У вашій структурі дуже багато каталогів 'project *'. Ви, мабуть, не використовуєте таких імен у реальному житті, правда? Скажімо, у нас є проект 'todo'. Як ви називаєте цих панів у такому випадку? Проблема, яку я бачу у вашій поточній структурі, полягає в змішуванні сховища з файлами, які не зберігаються (як ви зазначали вище). Можливо, прикро додавати сміття до .gitignore, чи не так? Ще одна сумнівна річ - це тримати оточуюче середовище так далеко від самого проекту. Чи є сенс? Чому б не створити ~ / docs, ~ / statics тощо? Навіть git любить сидіти біля вихідних файлів.
гонщик

Я б назвав їх: "todo_project" -> todo -> todo (або, можливо, todoapp). Я думаю, що важливо мати папку репозиторію в корені прямої ієрархії. Але, це лише моя думка. Щодо каталогу навколишнього середовища, коли вам потрібно налаштувати виробниче середовище, ви закінчите лише набравши: pip install -U -r вимоги.txt. Але, як я вже сказав, для одного немає рішення.
кор

Таким чином, шлях до основного додатку - це "projects / todo_project / todo / todo". Слово "проекти" повторювалося двічі, а слово "todo" повторювалося три рази. Це здається "проектами / проект / мій_проект / проект_дир / проект / проект". Назви дуже незрозумілі. Це одна з головних проблем, яку я намагаюся вирішити в своїй структурі каталогів. Я хочу назвати каталоги, щоб полегшити розуміння ієрархії. Як щодо кореня сховища, чи можете ви пояснити, чому це важливо? Також ви можете, будь ласка, пояснити, що добре утримувати занепокоєння поза основним режисером проекту?
гонщик

13

Мені не подобається створювати новий settings/каталог. Я просто додаю файли з іменем, settings_dev.pyі settings_production.pyтому мені не доведеться редагувати файли BASE_DIR. Підхід нижче збільшує структуру за замовчуванням замість зміни.

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

Я думаю це:

    settings.py
    settings_dev.py
    settings_production.py

краще за це:

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

Ця концепція застосовується і до інших файлів.


Я зазвичай місце node_modules/і bower_components/в директорії проекту в за замовчуванням static/папці.

Іноді це vendor/каталог для підмодулів Git, але зазвичай я розміщую їх у static/папці.


4

Ось що я дотримуюся в моїй системі.

  1. Усі проекти : У моїй домашній папці є каталог проектів, тобто ~/projects. Усі проекти опираються всередині нього.

  2. Індивідуальний проект : Я дотримуюсь стандартизованого шаблону структури, що використовується багатьма розробниками під назвою django-skel для окремих проектів. В основному він піклується про всі ваші статичні файли та мультимедійні файли та все.

  3. Віртуальне середовище : у мене в папці virtualenvs всередині мого дому, щоб зберігати всі віртуальні середовища в системі, тобто ~/virtualenvs. Це дає мені гнучкість, що я знаю, які всі віртуальні середовища у мене є, і я можу легко використовувати

Наведені вище 3 - це основні розділи мого робочого середовища.

Усі інші частини, про які ви згадали, в основному залежать від проекту до основи проекту (тобто ви можете використовувати різні бази даних для різних проектів). Тож вони повинні проживати в своїх окремих проектах.


Дякую. Можливо, буде прикро додавати сміття до .gitignore при змішуванні сховища з файлами, які не зберігаються. Це не воно? Деякі з моїх проектів мають до десяти і більше таких файлів і файлів, тому це створює для мене справжню проблему. Ще одна сумнівна річ - це тримати оточуюче середовище далеко від самого проекту. Яка гнучкість у такому рішенні? Чому б не створити ~ / docs, ~ / statics тощо? Навіть git любить сидіти біля вихідних файлів. Я подумав, що гнучкість - це коли я можу просто скопіювати / перемістити / архівувати / видалити весь каталог проектів, включаючи virtualenv, і можу легко підтримувати декілька середовищ у межах одного проекту
гонщик

4

Відповідно до скелету проекту Django, відповідна структура каталогів, яку можна дотримуватися, така:

[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

Зверніться до https://django-project-skeleton.readthedocs.io/en/latest/structure.html для останньої структури каталогів.


7
Я ненавиджу підхід [ім'я проекту] / [ім'я проекту]!)
гонщик

1
скелет django-проекту не є "Документацією Джанго". Було б точніше сказати "Відповідно до скелету django-project, ...".
David Winiecki

0

Ви можете використовувати https://github.com/Mischback/django-project-skeleton сховище.

Виконати команду нижче:

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

Структура приблизно така:

[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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.