В моем ~/projects/
каталоге есть два вида «проектов» Django , оба имеют немного различную структуру:
- Автономные сайты
- Сменные приложения
Автономный сайт
В основном частные проекты, но не обязательно. Обычно это выглядит так:
~/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/
каталог и импортировать их, используя относительный импорт.
Шаблоны / статические / локаль / тестовые файлы
Я поместил эти шаблоны и статические файлы в глобальный каталог templates / static, а не в каждое приложение. Эти файлы обычно редактируются людьми, которых вообще не волнует структура кода проекта или python. Если вы являетесь разработчиком полного стека и работаете в одиночку или в небольшой команде, вы можете создать для каждого приложения шаблоны / статический каталог. Это действительно просто вопрос вкуса.
То же самое относится и к локали, хотя иногда удобно создать отдельный каталог локали.
Обычно тесты лучше размещать внутри каждого приложения, но обычно существует множество интеграционных / функциональных тестов, которые тестируют больше приложений, работающих вместе, поэтому каталог глобальных тестов имеет смысл.
Каталог Tmp
В корне проекта есть временный каталог, исключенный из VCS. Он используется для хранения медиа / статических файлов и базы данных sqlite во время разработки. Все в tmp может быть удалено в любое время без проблем.
Virtualenv
Я предпочитаю 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/
в корне проекта, но еще не использовал ее.
Сменное приложение
Эти приложения обычно готовы к публикации с открытым исходным кодом. Я взял пример ниже с Джанго-формы
~/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
.