¿Dónde exactamente se debe colocar la lógica de negocios de Python en Django?

26

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.

adrita
fuente
posible duplicado de ¿Dónde poner la lógica de negocios en el diseño de MVC?
Bart van Ingen Schenau
Encontré un artículo que analiza este tema extensamente (con la pirámide en mente, no django). Tiene algunos trucos sensatos: nando.oui.com.br/2014/04/01/…
kratenko el

Respuestas:

16

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.

Existen varias opciones, según cuáles sean sus requisitos:

  1. Agregue la lógica a, por ejemplo, el Imagemodelo. 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.

  2. Agregue la lógica como una Imageclase Python simple , por ejemplo, en un archivo llamado image.py. Nada en Django le impide agregar una lógica distinta a la de los módulos viewso models. 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).

  3. 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.

  4. 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) .

Siento que intuitivamente no es correcto ya que el modelo debe comunicarse exclusivamente con el back-end.

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).

miraculixx
fuente
¡Gracias! Fue realmente perspicaz. Creo que la opción número 3 debería ser lo suficientemente buena para mí. :)
adrita
Está bien calificar la respuesta negativa, pero agregue un comentario para que pueda mejorarla
miraculixx
5

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.

diek
fuente
Gracias por tus sugerencias. seguramente
revisará
Me alegro de que lo hayas solucionado, @miraculixx dio una explicación sólida. Si estás en fb únete al grupo django python framework.
diek
2

En los documentos oficiales de Django https://docs.djangoproject.com/en/1.11/ , dice:

Django tiene el concepto de "vistas" para encapsular la lógica responsable de procesar la solicitud de un usuario y de devolver la respuesta. Encuentre todo lo que necesita saber sobre las vistas a través de los siguientes enlaces:

Django recomienda que la lógica esté contenida en las vistas.

Simon
fuente
3
Eso no es necesariamente lo mismo que la lógica de negocios.
FirstLastname
1
No estoy de acuerdo con esa interpretación de la documentación de Django. En otra parte de la documentación de Django (por ejemplo, para 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.
Kye R