Hay dos tipos de "proyectos" de Django que tengo en mi ~/projects/
directorio, ambos tienen una estructura un poco diferente .:
- Sitios web independientes
- Aplicaciones conectables
Sitio web independiente
En su mayoría proyectos privados, pero no tiene que ser así. Suele verse así:
~/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
...
Configuraciones
Las configuraciones principales son las de producción. Otros archivos (por ejemplo staging.py
,
development.py
) simplemente importan todo production.py
y anulan solo las variables necesarias.
Para cada entorno, hay archivos de configuración separados, por ejemplo. producción, desarrollo. Tengo algunos proyectos que también tengo para probar (para el corredor de prueba), puesta en escena (como verificación antes de la implementación final) y configuración de heroku (para implementar en heroku).
Requisitos
Prefiero especificar los requisitos en setup.py directamente. Solo aquellos necesarios para el entorno de desarrollo / prueba en el que tengo requirements_dev.txt
.
Algunos servicios (por ejemplo, heroku) requieren tener requirements.txt
en el directorio raíz.
setup.py
Útil al implementar proyectos usando setuptools
. Se agrega manage.py
a PATH
, por lo que puedo ejecutar manage.py
directamente (en cualquier lugar).
Aplicaciones específicas del proyecto
Solía poner estas aplicaciones en el project_name/apps/
directorio e importarlas usando importaciones relativas.
Archivos de plantillas / static / locale / tests
Puse estas plantillas y archivos estáticos en plantillas globales / directorio estático, no dentro de cada aplicación. Por lo general, estos archivos son editados por personas que no se preocupan por la estructura del código del proyecto o Python. Si es un desarrollador de pila completa que trabaja solo o en un equipo pequeño, puede crear plantillas / directorio estático por aplicación. Realmente es solo una cuestión de gustos.
Lo mismo se aplica para la configuración regional, aunque a veces es conveniente crear un directorio de configuración regional separado.
Por lo general, es mejor colocar las pruebas dentro de cada aplicación, pero generalmente hay muchas pruebas de integración / funcionales que prueban que más aplicaciones funcionan juntas, por lo que el directorio de pruebas globales tiene sentido.
Directorio tmp
Hay un directorio temporal en la raíz del proyecto, excluido de VCS. Se utiliza para almacenar archivos multimedia / estáticos y bases de datos sqlite durante el desarrollo. Todo en tmp podría eliminarse en cualquier momento sin ningún problema.
Virtualenv
Prefiero virtualenvwrapper
colocar todos los venvs en el ~/.venvs
directorio, pero podría colocarlos dentro tmp/
para mantenerlos juntos.
Plantilla de proyecto
He creado una plantilla de proyecto para esta configuración, django-start-template
Despliegue
La implementación de este proyecto es la siguiente:
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
Puede usar en rsync
lugar de git
, pero aún necesita ejecutar un lote de comandos para actualizar su entorno.
Recientemente, hice una [django-deploy][2]
aplicación, que me permite ejecutar un comando de administración único para actualizar el entorno, pero lo he usado solo para un proyecto y todavía estoy experimentando con él.
Bocetos y borradores
Borrador de plantillas que coloco dentro del templates/
directorio global . Supongo que uno puede crear una carpeta sketches/
en la raíz del proyecto, pero aún no la he usado.
Aplicación enchufable
Estas aplicaciones generalmente están preparadas para publicar como código abierto. He tomado el siguiente ejemplo de django-forme
~/projects/django-app/
docs/
app/
tests/
example_project/
LICENCE
MANIFEST.in
README.md
setup.py
pytest.ini
tox.ini
.travis.yml
...
El nombre de los directorios está claro (espero). Puse los archivos de prueba fuera del directorio de la aplicación, pero realmente no importa. Es importante proporcionar README
y setup.py
, por lo tanto, el paquete se instala fácilmente pip
.