Minha estrutura padrão para um projeto Django

  |   Código

Como estruturar um projeto Django? Qual o conjunto mínimo de bibliotecas que eu preciso para iniciar um projeto? Quais as melhores práticas que eu posso implementar desde o começo do projeto? Como deixar o meu projeto preparado para facilitar o processo de deploy para vários ambientes? Esse post visa ajudar especialmente os iniciantes nesse framework a responder essas e outras perguntas importantes para quem deseja se aprofundar nessa tecnologia.

Assim como no anterior, esse artigo considera que você já conhece bem Python, que sabe ao menos como instalar o Django, e que, para o seu próprio bem, use virtualenv para isolar os ambientes de cada projeto e pip para instalação e desinstalação de pacotes.

Bibliotecas essenciais para um projeto Django

Abaixo estão as bibliotecas que instalo toda vez que vou iniciar um projeto:

  • Fabric - Indispensável para fazer deploy de projetos, principalmente quando você trabalha com mais de um servidor para o mesmo projeto nas diversas fases do processo de desenvolvimento.

  • South - Se não quiser passar pelo inferno das migrações de modelos de dados, e dos próprios dados em si, é mais do que essencial que instale essa ferramenta.

  • Unipath - Biblioteca orientada a objetos para realizar operações de arquivos e diretórios. Um ótimo substituto para o módulo os.path da biblioteca padrão do Python.

  • django-jenkins e bibliotecas auxiliares - Ver o post Como configurar um projeto Django no Jenkins.

  • django-braces - App Django que inclui uma coleção de mixins que complementam as Class Based Views.

  • django-crispy-forms - App Django para facilitar a renderização dos componentes dos forms.

  • django-debug-toolbar - App indispensável no desenvolvimento de projetos Django. Traz todas as informações de debug a respeito dos templates e da execução do código que você precisa.

  • django-discover-runner - Uma alternativa ao test runner do Django baseado na unittest2.

  • django-floppyforms - HTML5 widgets e outras facilidades para ser usado em conjunto com o django-crispy-forms.

  • django-model-utils - Utilitários para os models do Django.

  • flup - Essa biblioteca serve para rodar o projeto em modo FastCGI no servidor web de sua escolha. O servidor web que eu uso é o nginx pela rapidez e praticidade.

Estrutura do projeto

Finalmente, depois de instalar os pacotes mencionados acima, chegou a hora de organizar a estrutura do seu projeto. A estrutura que eu uso, é essa aqui, no seu projeto substitua a palavra project pelo nome do seu projeto.

:::bash
<project_root>
├── <django_project_root>
│   ├── data
│   ├── log
│   ├── main
│   ├── media
│   ├── static
│   ├── <configuration_root>
│   │   ├── settings
│   │   │   ├── __init__.py
│   │   │   ├── base.py
│   │   │   ├── development.py
│   │   │   ├── production.py
│   │   │   ├── staging.py
│   │   │   └── testing.py
│   │   ├── __init__.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   └── manage.py
├── requirements
│   ├── _base.txt
│   ├── development.txt
│   ├── production.txt
│   ├── staging.txt
│   └── testing.txt
├── bootstrap.py
├── fabfile.py
└── nginx.conf

Explicando a estrutura...

A partir da versão 1.4, o Django, ao criar um projeto novo, cria uma estrutura de pasta em 2 níveis, na primeira inicialmente você fica apenas com o arquivo manage.py e no segundo nível é onde fica os arquivos settings.py, urls.py.

Na estrutura que eu uso em meus projetos, a proposta é ter 3 níveis. O primeiro nível, chamado de project_root, serve para incluir os arquivos que estão relacionados com o deploy do projeto e além disso, contém uma pasta chamada requirements que contém todos os requisitos do projeto segregados por ambiente, assim como acontece com a pasta settings que veremos mais a seguir. Além disso, essa pasta serve para conter outros arquivos que não estão relacionados diretamente com o código-fonte do projeto, como arquivos de design, por exemplo. Segue uma explicação básica para os arquivos que encontramos nessa pasta.

  • bootstrap.py - Esse arquivo usa o requirements.txt para instalar automaticamente todas as bibliotecas da aplicação usando o pip.

  • fabfile.py - Arquivo da biblioteca Fabric que contém todas as funções de deploy da aplicação.

  • nginx.conf - Arquivo de configuração do nginx que precisa ser copiado para o servidor toda vez que é feito o deploy da aplicação.

No segundo e terceiro nível, nós temos a estrutura de pasta que foi criada pelo Django, sendo que o segundo nível chamamos de django_project_root e o terceiro chamamos de configuration_root.

django_project_root

Esse é o diretório padrão de um projeto Django, contém o arquivo manage.py, e também as pastas específicas que representam as aplicações do projeto. As demais pastas que constam na estrutura são explicadas logo abaixo.

Pasta data

Essa pasta será usada para para armazenar o banco de dados (caso o mesmo seja embutido na aplicação, como o SQLite) e servirá para armazenar outros artefatos como scripts SQL ou Python, dados de migração, fontes de dados ou quaisquer outras informações relacionadas a base de dados do projeto.

Pasta log

Essa pasta é usada para fazer o deploy com o nginx. Esse servidor web precisa dos dois arquivos contidos nessa pasta para guardar o log de acessos e de erros da aplicação.

Caso não vá usar o nginx, pode deletar essa pasta, ou talvez usá-la para implementar algum tipo de log e armazená-lo.

Pasta main

Representa a app principal do projeto. Independente da divisão de apps que você irá escolher para o projeto, essa app irá servir como um agregador de artefatos que são comuns a todo o projeto ou que serão utilizados por todas as demais apps do projeto.

Por exemplo, essa app main poderá conter os arquivos relativos a tela de login e index do projeto. Poderá conter os arquivos estáticos que são comuns a todo o projeto e assim por diante.

No caso de projetos que sejam muito pequenos, talvez essa seja a única app necessária.

Pasta static

Essa pasta serve para abrigar todos os arquivos estáticos encontrados no projeto quando o comando collectstatic é executado. Para mais informações sobre esse assunto, veja a documentação do Django sobre como gerenciar arquivos estáticos.

Pasta media

Essa pasta serve para abrigar todos os arquivos do projeto relacionados a upload realizados pelo usuário ou arquivos que são gerados dinamicamente pelo próprio projeto (imagens de relatório, por exemplo).

configuration_root

Esse diretório contém toda a parte de configuração da aplicação, como o arquivo urls.py e o módulo settings.

Módulo settings

Essa pasta contém os arquivos de configuração da aplicação segregados por ambiente e com o arquivo base.py que é responsável por conter todas as configurações comuns a todos os ambientes da aplicação. Esses arquivos ficam organizados numa espécie de herança. Todos os arquivos herdam de base.py e especializam as suas configurações por ambiente.

E onde entra o settings.py nessa brincadeira? No final das contas, o arquivo settings.py será deletado, e agora toda vez que for rodar a sua aplicação, basta indicar qual o arquivo de configuração que deseja usar através do parâmetro settings, como segue:

:::bash
python manage.py runserver --settings=project.template.settings.testing

Concluindo...

Essa é a estrutura padrão que eu uso para os meus projetos. Caso queira baixar os fontes desse projeto padrão, fique à vontade para visitar o repositório do projeto no GitHub. Consultando os fontes talvez fique bem mais fácil de entender tudo o que foi exposto nesse artigo. De qualquer forma, espero que o tenha ajudado pelo menos a ter uma idéia inicial de como organizar os seus projetos. Agora, compartilhe suas idéias e sugestões nos comentários.

Atualização: 15 de fevereiro de 2013

Esse post foi atualizado em diversas partes para refletir as boas práticas aprendidas ao ler o livro Two Scoops of Django.

Referências

Gareth Rushgrove: Fabric, Django, Git, Apache, Mod_wsgi, Virtualenv and Pip Deployment

Klaus Laube: Como organizar seus projetos Django

Django Best Practices: A guide to developing and deploying with the Django Web framework

Comments powered by Disqus
Share