Existem dois tipos de "projetos" do Django que tenho no meu ~/projects/
diretório, ambos com uma estrutura um pouco diferente:
- Sites independentes
- Aplicações conectáveis
Site independente
Projetos principalmente privados, mas não precisam ser. Geralmente é assim:
~/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
...
Configurações
As principais configurações são as de produção. Outros arquivos (por exemplo staging.py
,
development.py
) simplesmente importam tudo production.py
e substituem apenas as variáveis necessárias.
Para cada ambiente, existem arquivos de configurações separados, por exemplo. produção, desenvolvimento. Em alguns projetos, também tenho as configurações de teste (para test runner), teste (como uma verificação antes da implantação final) e heroku (para implantação no heroku).
Exigências
Prefiro especificar requisitos em setup.py diretamente. Somente aqueles necessários para o ambiente de desenvolvimento / teste em que eu trabalho requirements_dev.txt
.
Alguns serviços (por exemplo, heroku) precisam ter requirements.txt
no diretório raiz.
setup.py
Útil ao implantar projeto usando setuptools
. Acrescenta manage.py
a PATH
, para que eu possa executar manage.py
diretamente (em qualquer lugar).
Aplicativos específicos do projeto
Eu costumava colocar esses aplicativos no project_name/apps/
diretório e importá-los usando importações relativas.
Arquivos de templates / static / locale / tests
Coloquei esses modelos e arquivos estáticos no diretório global de modelos / estático, não dentro de cada aplicativo. Esses arquivos geralmente são editados por pessoas que não se importam com a estrutura de código do projeto ou com o python. Se você é um desenvolvedor de pilha completa trabalhando sozinho ou em uma equipe pequena, pode criar modelos / diretório estático por aplicativo. É realmente apenas uma questão de gosto.
O mesmo se aplica à localidade, embora às vezes seja conveniente criar um diretório local.
Normalmente, os testes são melhores para colocar dentro de cada aplicativo, mas geralmente há muitos testes funcionais / de integração que testam mais aplicativos trabalhando juntos, portanto o diretório global de testes faz sentido.
Diretório tmp
Há um diretório temporário na raiz do projeto, excluído do VCS. É usado para armazenar arquivos estáticos / de mídia e banco de dados sqlite durante o desenvolvimento. Tudo no tmp pode ser excluído a qualquer momento sem problemas.
Virtualenv
Eu prefiro virtualenvwrapper
e coloque todos os venvs no ~/.venvs
diretório, mas você pode colocá-los dentro tmp/
para mantê-los juntos.
Modelo de projeto
Eu criei um modelo de projeto para esta configuração, django-start-template
Desdobramento, desenvolvimento
A implantação deste projeto é a seguinte:
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
Você pode usar em rsync
vez de git
, mas ainda assim precisa executar lotes de comandos para atualizar seu ambiente.
Recentemente, criei o [django-deploy][2]
aplicativo, o que me permite executar um único comando de gerenciamento para atualizar o ambiente, mas eu o usei apenas para um projeto e ainda estou experimentando.
Esboços e rascunhos
Rascunho de modelos que coloco dentro do templates/
diretório global . Eu acho que se pode criar uma pasta sketches/
na raiz do projeto, mas ainda não a usou.
Aplicação plugável
Esses aplicativos geralmente são preparados para publicar como código aberto. Eu peguei o exemplo abaixo do django-forme
~/projects/django-app/
docs/
app/
tests/
example_project/
LICENCE
MANIFEST.in
README.md
setup.py
pytest.ini
tox.ini
.travis.yml
...
O nome dos diretórios é claro (espero). Coloquei os arquivos de teste fora do diretório do aplicativo, mas isso realmente não importa. É importante fornecer README
e setup.py
, portanto, o pacote é facilmente instalado pip
.