2010-04-19 9 views
25

Estoy en un equipo que desarrolla un portal universitario basado en la web, que se basará en Django. Todavía estamos en las etapas de exploración, y estoy tratando de encontrar la mejor manera de establecer el entorno de proyecto/desarrollo.Gran diseño de la aplicación Django

Mi idea inicial es desarrollar el sistema como una "aplicación" Django, que contiene sub-aplicaciones para separar las diferentes partes del sistema. La razón por la que pretendo hacer estas aplicaciones "secundarias" es que no tendrían ningún uso fuera de la aplicación principal en absoluto, por lo que no tendría sentido distribuirlas por separado. Creemos que el portal se instalará en múltiples ubicaciones (en diferentes universidades, por ejemplo), por lo que la aplicación principal se puede incluir en varios proyectos de Django para instalarla. Por lo tanto, tenemos un repositorio diferente para cada proyecto de ubicación, que en realidad es solo un archivo settings.py que define las aplicaciones del portal instaladas, y un urls.py que enruta las direcciones URL a él.

Empecé a escribir algunos códigos iniciales, sin embargo, y me encontré con un problema. Parte del código que maneja la autenticación de usuario y los perfiles parece no tener un hogar. No pertenece conceptualmente a la aplicación del portal, ya que no se relaciona con la funcionalidad del portal. También, sin embargo, no puede ir en el repositorio del proyecto, ya que entonces estaría duplicando el código sobre el repositorio de cada ubicación. Si descubriera un error en este código, por ejemplo, tendría que replicar manualmente el arreglo sobre todos los archivos de proyecto de la ubicación.

Mi idea para una solución es hacer que todos los repos proyectos sean una bifurcación de un proyecto de ubicación "maestro", de modo que pueda extraer cualquier cambio de ese maestro. Creo que esto es complicado, y significa que tengo un repositorio más para cuidar.

Estoy buscando una mejor manera de lograr este proyecto. ¿Alguien puede recomendar una solución o un ejemplo similar que pueda ver? El problema parece ser que estoy desarrollando un proyecto Django en lugar de solo una aplicación Django .

+0

Como mencioné en la respuesta de @Jack: Estoy desarrollando lo que es esencialmente un proyecto Django *, y no solo una aplicación Django *. Por lo tanto, necesito organizar mi proyecto en solo un repositorio, y usar algo como el truco local_settings.py para alterar cosas como el título del sitio para diferentes sitios donde está instalada la aplicación. –

+0

(un poco tarde, pero ...) A menos que estés usando muchas cosas específicas de django (administrador, aplicaciones de terceros, etc.) me quedaría con un nivel más bajo, como Flask. De esa forma puedes tener un control total sobre la forma en que haces las cosas.Acabo de dejar a Django en un proyecto más grande en el que estoy trabajando. Todo lo que hago debe hacerse de manera totalmente personalizada después de toparse con un problema tras otro tratando de hacer las cosas a la manera de Django. – orokusaki

Respuesta

32

La mejor manera que he encontrado para hacer esto es crear aplicaciones y luego un proyecto para unirlas. La mayoría de mis proyectos tienen aplicaciones similares que están incluidas en cada uno. Correos electrónicos, notas, recordatorios de acción, autenticación de usuario, etc. Mi diseño preferido es de esta manera:

  • proyecto/
    • settings.py
    • urls.py
    • views.py
    • ...
  • aplicaciones/
    • correos electrónicos/
      • urls.py
      • views.py
      • ...
    • notas/
      • urls.py
      • views.py
      • . ..
    • ...

aplicaciones:

Cada una de las "aplicaciones" vale por sí mismo, y que no sea una settings.py, no se basa en el proyecto en sí (aunque puede confiar en otras aplicaciones). Una de las aplicaciones es la autenticación y administración del usuario. Tiene todas las URL para llevar a cabo sus tareas en apps/auth/urls.py. Todas sus plantillas están en apps/auth/templates/auth/. Toda su funcionalidad es autónoma, de modo que cuando necesito modificar algo, sé a dónde ir.

proyecto:

El project/ contiene todos el pegamento necesario para poner estas aplicaciones individuales en forma conjunta en el proyecto final. En mi caso, hice uso pesado de settings.INSTALLED_APPS en project/ para discernir qué vistas de las aplicaciones tenía disponibles.De esta forma, si tomo apps.notes de mi INSTALLED_APPS, todo funciona de maravilla, sin notas.

Mantenimiento:

Este diseño/metodología/plan también tiene efectos positivos a largo plazo ramificaciones. Puede volver a utilizar cualquiera de las aplicaciones más adelante, casi sin trabajo. Puede probar el sistema de abajo hacia arriba, asegurándose de que cada una de las aplicaciones funcione según lo previsto antes de integrarse en el todo, ayudándole a encontrar/corregir errores más rápidamente. Puede implementar una característica nueva sin implementarla en las instancias existentes de la aplicación (si no está en el INSTALLED_APPS, no pueden verla).

Estoy seguro de que hay formas mejor documentadas de diseñar un proyecto, y maneras más ampliamente utilizadas, pero esta es la que mejor me ha funcionado hasta ahora.

+3

Upvoted con la advertencia de que las aplicaciones aún pueden tener dependencias. Dicho eso, deberían tener sentido. Si tiene comentarios, esto tiene una dependencia en la aplicación de autenticación django. Si tiene una aplicación de notificación, puede tener una dependencia en su aplicación de correo electrónico. Todas estas dependencias deben estar bien documentadas. –

+0

Entiendo cómo funcionan las aplicaciones reutilizables en Django, pero mi problema es que mis aplicaciones no tienen absolutamente ningún uso fuera de este proyecto. Entonces, ¿cómo puedo mantener instancias separadas controladas por versiones de código similar para las diferentes ubicaciones? –

+0

@Justin, tienes razón. Lo escribí mal, gracias por señalarlo. @Rob, depende de qué funcionalidad está cambiando entre las instancias. Si no está cambiando la funcionalidad principal de una pieza (como la autorización), entonces puede hacer que auth sea una aplicación independiente, y la forma en que se implemente variará según el proyecto en el que se inserte. De esta manera auth no necesita bifurcar, solo el proyecto en sí. –

4

Usted debe echar un vistazo a:

  • Django generic relations
  • Django reusable apps mejores prácticas si desea volver a utilizar
  • GIT o cualquier otro CVS (GIT es ideal para el mantenimiento + despliegue)
  • Fabric si necesita implementaciones automatizadas/actualizaciones

Yo suelo usar esta estructura del proyecto:

  • /djangoproject
    • /aplicaciones
      • /MAIN # el código principal
      • /estática # cada aplicación sub puede servir estática
      • /aplicación1
      • /estática # cada aplicación secundaria puede servir estática
      • /app2 ...
    • /scripts # manage.py, wsgi, apache.conf, fabfile.py ...
    • /core # bibliotecas ...
    • settings.py
    • local_settings.py

Cada aplicación en/aplicaciones tienen un urls.py eso autoincluded en el principal urls.py . Y cada aplicación puede ser un submódulo de git (o svn externo)

Además, al usar git, puede trabajar en diferentes ramas paralelas (master/dev/customerA/customerB ...) y fusionar actualizaciones.

Crear real reutilizable no es tan fácil con django.

+1

Estoy usando Mercurial para control de versiones, y también uso el truco local_settings. Mi pregunta era más acerca de cómo mantener los proyectos separados, pero aún así mantener una versión central de copia controlada del código central. –

4

Puede extraer la funcionalidad común en un módulo separado y hacer que sus aplicaciones dependen de ella:

  • my_portal
  • auth_module
  • profiles_module
  • Application1 (depende de auth_module)
  • application2 (depende de auth_module y profiles_module)

Creo que el hecho de que un proyecto 'clásico' de Django parezca 'contener' las aplicaciones que está utilizando le impide ver la imagen; de hecho, no es necesario. Para un proyecto en el que vas a tener algún tipo de módulo conectable, te sugiero que organices las aplicaciones como huellas y uses zc.buildout + djangorecipe para administrar todo.

De esta manera podrá mantener sus módulos en una estructura plana de un nivel. Los huevos tienen la capacidad de especificar dependencias, por lo que si instala la aplicación 1 (ver arriba), auth_module se instalará automáticamente.

También será fácil tener diferentes configuraciones desplegadas en diferentes servidores. Supongamos, usted tiene server1 que se ha instalado y Application1 servidor2 que tiene tanto Application1 y application2 instalado - sólo puede tener dos configuraciones:

server1.cfg:

[buildout] 
extends = base_deployment.cfg 
eggs += application1 

server2.cfg:

[buildout] 
extends = base_seployment.cfg 
eggs += application1 
     application2 

djangorecipe también le permite especificar diferentes archivos de configuración para cada configuración de buildout, por lo que podrá agregar los bits necesarios a las URL del proyecto principal y a la configuración de las aplicaciones instaladas.

Sin mencionar que también puede tener una configuración separada para la configuración de desarrollo (con debug = True y Django Debug Toolbar instalado, por ejemplo).

+0

No sabía sobre la construcción, así que gracias por mencionar eso. Todavía no estoy seguro de haber encontrado la mejor manera de hacerlo, no estoy particularmente interesado en diferentes "permutaciones" de mi proyecto, generalmente será el mismo en todas partes. Solo necesito poder cambiar el título, por ejemplo, y anular las plantillas cuando sea necesario. –

+0

No se trata solo de "permutaciones": - djangorecipe le permite especificar qué archivo de configuración usar, para que pueda anular las cosas por instalación de una forma agradable, limpia y controlada por versión (es decir, settings_production.py dice "from settings import *; DEBUG = False" y settings_dev.py dice "from settings import *; DEBUG = True" - buildout le permite controlar qué versiones de terceros (y sus propios) módulos se están instalando para que usted puede crear instalaciones repetitivamente - instala todo localmente sin contaminar los directorios python del sistema (similar a virtualenv pero más agradable) – Sergey

Cuestiones relacionadas