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
.
scripts
argumento de palabra clave: github.com/elvard/django-start-template/blob/master/project/… Me gustatmp
porque sugiere "algo temporal" que se puede eliminar en cualquier momento. Toplevellocale
dir no es necesario, puedes colocarlo en cualquier lugar. Simplemente me gusta que sea consistente con directorios estáticos / plantillas.git checkout
o excluyendo solo un directorio 'tmp' al clonar el directorio del proyecto. Por lo tanto, parece que su estructura cumple con todos los requisitos, y es lo suficientemente clara como para usarla regularmente sin ninguna duda. Estoy aceptando tu respuesta. Gracias.src
dentro de la raíz del proyecto. Esta es la copia de trabajo de los archivos fuente y la raíz del repositorio git. Puedo hacer varias copias de este directorio -src
,src.bak
,src_tmp
y así sucesivamente. Otros directorios no reporto comoenv
,tmp
,media
,backup
residir en el mismo nivel. Así que encp -r src src.bak
cualquier momento puedo experimentar con git o comparar versiones con una herramienta externa. Si bien tiene archivos locales dentro de su repositorio, tengo repositorio dentro de mi directorio de archivos locales (viceversa). El mejor nombre de misrc
directorio esrepo
.Mi respuesta está inspirada en mi propia experiencia laboral, y principalmente en el libro Two Scoops of Django, que recomiendo encarecidamente, y donde puedes encontrar una explicación más detallada de todo. Solo responderé algunos de los puntos, y cualquier mejora o corrección será bienvenida. Pero también puede haber modales más correctos para lograr el mismo propósito.
Proyectos
Tengo una carpeta principal en mi directorio personal donde mantengo todos los proyectos en los que estoy trabajando.
Archivos de origen
Yo personalmente uso la raíz del proyecto django como raíz del repositorio de mis proyectos. Pero en el libro se recomienda separar ambas cosas. Creo que este es un mejor enfoque, así que espero comenzar a hacer el cambio progresivamente en mis proyectos.
Repository
Git o Mercurial parecen ser los sistemas de control de versiones más populares entre los desarrolladores de Django. Y los servicios de alojamiento más populares para copias de seguridad de GitHub y Bitbucket .
Entorno virtual
Utilizo virtualenv y virtualenvwrapper. Después de instalar el segundo, debe configurar su directorio de trabajo. El mío está en mi directorio / home / envs , como se recomienda en la guía de instalación de virtualenvwrapper. Pero no creo que lo más importante sea dónde se coloca. Lo más importante cuando se trabaja con entornos virtuales es mantener actualizado el archivo require.txt.
Carpeta de proyecto de raíz estática
Carpeta de proyecto raíz de medios
README
raíz del repositorio
LICENCIA
raíz del repositorio
Repositorio de documentos raíz. Estos paquetes de Python pueden ayudarlo a facilitar el mantenimiento de su documentación:
Bocetos
Ejemplos
Base de datos
fuente
No me gusta crear un nuevo
settings/
directorio. Simplemente agrego archivos con nombresettings_dev.py
ysettings_production.py
así no tengo que editar elBASE_DIR
. El siguiente enfoque aumenta la estructura predeterminada en lugar de cambiarla.Pienso esto:
es mejor que esto:
Este concepto se aplica también a otros archivos.
Normalmente coloco
node_modules/
ybower_components/
en el directorio del proyecto dentro de lastatic/
carpeta predeterminada .En algún momento un
vendor/
directorio para submódulos de Git pero generalmente los coloco en lastatic/
carpeta.fuente
Esto es lo que sigo en mi sistema.
Todos los proyectos : hay un directorio de proyectos en mi carpeta de inicio, es decir
~/projects
. Todos los proyectos descansan en su interior.Proyecto individual : sigo una plantilla de estructura estandarizada utilizada por muchos desarrolladores llamada django-skel para proyectos individuales. Básicamente se encarga de todos sus archivos estáticos y archivos multimedia y todo.
Entorno virtual : tengo una carpeta virtualenvs dentro de mi casa para almacenar todos los entornos virtuales en el sistema, es decir
~/virtualenvs
. Esto me da la flexibilidad de saber cuáles son todos los entornos virtuales que tengo y qué aspecto puedo usar fácilmenteLos 3 anteriores son las principales particiones de mi entorno de trabajo.
Todas las otras partes que mencionó dependen en su mayoría de proyecto a proyecto (es decir, puede usar diferentes bases de datos para diferentes proyectos). Entonces deberían residir en sus proyectos individuales.
fuente
Según el Django Project Skeleton, la estructura de directorio adecuada que se puede seguir es:
Consulte https://django-project-skeleton.readthedocs.io/en/latest/structure.html para obtener la última estructura de directorios.
fuente
Puede usar el repositorio https://github.com/Mischback/django-project-skeleton .
Ejecute debajo del comando:
La estructura es algo como esto:
fuente