Acabo de comenzar a aprender Django / Python / Desarrollo web. Este problema me ha estado preocupando por un tiempo ahora.
Estoy creando una aplicación con múltiples plantillas en Django. Tengo un views.py que básicamente representa las respuestas a las plantillas respectivas y tengo un models.py donde he estructurado mi base de datos. En una de mis plantillas, necesito cargar una imagen (que puedo hacer) y necesito ejecutar una lógica que se base en las características de la imagen cargada (aún no está hecha). Esta lógica implica muchos cálculos pesados. Después de realizar los cálculos, la lógica debería devolver cierta información procesada (coordenadas) a la plantilla.
He podido realizar todas estas acciones con éxito en una aplicación de escritorio de Python independiente que llama a los archivos de Python uno tras otro. Sin embargo, dado que ahora quiero hacer de esto una aplicación web, he comenzado a usar el marco Django.
He realizado muchas búsquedas, pero todavía no puedo averiguar dónde exactamente debo colocar este archivo de Python que contiene toda la lógica. ¿Debo tener otro archivo basado en la clase (logic.py)
y llamarlo desde el view.py
? Busqué en Google y descubrí que muchos desarrolladores están colocando su lógica de negocios en sus modelos.py en Django. Sin embargo, creo que intuitivamente no es correcto ya que el modelo debe comunicarse exclusivamente con el back-end. Cualquier ayuda sería apreciada. Gracias de antemano.
Respuestas:
Existen varias opciones, según cuáles sean sus requisitos:
Agregue la lógica a, por ejemplo, el
Image
modelo. Esta es una opción útil si necesita almacenar metadatos por imagen en la base de datos, y cada instancia de modelo (cada imagen) se procesa por sí misma.Agregue la lógica como una
Image
clase Python simple , por ejemplo, en un archivo llamadoimage.py
. Nada en Django le impide agregar una lógica distinta a la de los módulosviews
omodels
. Esta es una buena opción si la lógica de la imagen es un componente central de su aplicación Django (por ejemplo, una aplicación de procesamiento de imágenes).Cree un proyecto de Python separado que proporcione la lógica, luego instálelo desde sus vistas. Asegúrese de instalar este proyecto en el entorno Python de su aplicación Django. Esta opción es válida si el propósito de su aplicación Django es cargar y ver imágenes, o mostrar los resultados del procesamiento de imágenes en respuesta directa a la solicitud de un usuario, pero donde el procesamiento de imágenes también podría ser utilizado por otros proyectos.
Cree una aplicación separada que procese las solicitudes de forma asincrónica y se ejecute por separado de su aplicación Django. Esta opción es útil si necesita desacoplar el procesamiento de imágenes del ciclo de solicitud de la aplicación, procesar una gran cantidad de imágenes o si cada cálculo toma demasiado tiempo para resolverse dentro del tiempo de un ciclo de solicitud (digamos, como máximo, 500ms a 1s) .
No hay nada en Django que requiera un modelo para comunicarse con el back-end, o más bien con la base de datos. Creo que está mezclando la semántica de lo que Django generalmente considera un modelo (es decir, una abstracción de una o varias tablas en la base de datos), en comparación con el término modelo como una construcción de diseño (por ejemplo, en el diseño impulsado por dominio).
fuente
Daniel Greenfeld, coautor de "Two Scoops of Django", recomienda que la lógica de negocios debe estar en los modelos "cuando sea posible, o en los formularios si es necesario". En cuanto al posible duplicado de Bart, django puede ser similar a MVC pero es no MVC. Como se explica aquí en la documentación oficial de django faq. @adrita, creo que es necesario que revise la documentación oficial para ayudarlo a comprender un poco mejor el concepto de modelos, vistas y plantillas.
fuente
En los documentos oficiales de Django https://docs.djangoproject.com/en/1.11/ , dice:
Django recomienda que la lógica esté contenida en las vistas.
fuente
Model.clean()
) se implica un poco más explícitamente que (si simplemente se trata de un proyecto de Django del mundo real para modelos, plantillas y vistas), la lógica empresarial (o al menos, la validación) pertenece al capa modelo Tenga en cuenta que no incluí formularios en esa simplificación, que también son aceptables.