web-dev-qa-db-fra.com

où exactement python la logique métier doit être placée dans django

Je viens de commencer à apprendre le développement Django/Python/Web. Ce problème me préoccupe depuis un certain temps maintenant.

Je crée une application avec plusieurs modèles dans Django. J'ai un views.py qui ne fait que rendre les réponses aux modèles respectifs et j'ai un models.py où j'ai structuré ma base de données. Dans l'un de mes modèles, je dois télécharger une image (ce que je suis capable de faire) et j'ai besoin d'exécuter une logique qui est basée sur les fonctionnalités de l'image téléchargée (pas encore fait). Cette logique implique beaucoup de calculs lourds. Après avoir effectué les calculs, la logique doit renvoyer certaines informations traitées (coordonnées) au modèle.

J'ai pu effectuer toutes ces actions avec succès dans une application autonome python bureau appelant python fichiers l'un après l'autre. Cependant, puisque je veux maintenant faire c'est une application web que j'ai commencé à utiliser le framework Django.

J'ai fait beaucoup de recherches, mais je ne suis toujours pas en mesure de savoir exactement où placer ce fichier Python contenant toute la logique. Dois-je avoir un autre fichier basé sur une classe (logic.py) et appelez-le depuis le view.py? J'ai googlé et constaté que de nombreux développeurs placent leur logique métier dans leur models.py dans Django. Cependant, je pense que ce n'est intuitivement pas correct car le modèle devrait communiquer exclusivement avec le back-end. Toute aide serait appréciée.Merci à l'avance.

26
adrita

J'ai fait beaucoup de recherches mais je ne suis toujours pas en mesure de savoir exactement où placer ce fichier Python contenant toute la logique.

Il existe un certain nombre d'options, selon vos besoins:

  1. Ajoutez la logique à par ex. le modèle Image. C'est une option utile si vous devez stocker des métadonnées par image dans la base de données et que chaque instance de modèle (chaque image) est traitée par elle-même.

  2. Ajoutez la logique en tant que classe simple Python Image, par exemple dans un fichier appelé image.py. Rien dans Django vous empêche d'ajouter de la logique autre que celle des modules views ou models. C'est une bonne option si la logique de l'image est un composant central de votre application Django (par exemple une application de traitement d'image).

  3. Créez un projet Python qui fournit la logique, puis appelez-le à partir de vos vues. Assurez-vous d'installer ce projet dans votre Django app's Python. Cette option est valide si le but de votre application Django est de télécharger et d'afficher des images, ou d'afficher les résultats du traitement d'images en réponse directe à la demande d'un utilisateur , mais où le traitement d'image pourrait également être utilisé par d'autres projets.

  4. Créez une application distincte qui traite les demandes de manière asynchrone et est exécutée séparément de votre application Django. Cette option est utile si vous devez découpler le traitement d'image du cycle de demande de l'application, traiter un grand nombre de images ou lorsque chaque calcul prend trop de temps à résoudre dans le temps d'un cycle de demande (disons dans un délai maximum de 500 ms à 1 s).

Je pense que ce n'est intuitivement pas correct car le modèle devrait communiquer exclusivement avec le back-end.

Il n'y a rien dans Django qui nécessite un modèle pour communiquer avec le back-end, ou plutôt la base de données. Je pense que vous mélangez la sémantique de ce qui Django typiquement considère un modèle (à savoir, une abstraction d'une ou plusieurs tables dans la base de données), par rapport au terme modèle comme une construction de conception (par exemple, comme dans la conception pilotée par le domaine).

17
miraculixx

Daniel Greenfeld, co-auteur de "Two Scoops of Django, recommande que la logique métier soit dans les modèles" lorsque cela est possible, ou dans les formulaires si vous le devez. "Quant au possible double de Bart, Django = peut être similaire à MVC mais ce n'est pas MVC. Comme expliqué ici dans le Django faq de documentation @adrita, je pense que vous aurez peut-être besoin de passer en revue la documentation officielle pour vous aider à mieux comprendre le concept de modèles, de vues et de modèles.

5
diek

Dans les documents officiels Django https://docs.djangoproject.com/en/1.11/ , il est dit:

Django a le concept de "vues" pour encapsuler la logique responsable du traitement de la demande d'un utilisateur et du retour de la réponse. Trouvez tout ce que vous devez savoir sur les vues via les liens ci-dessous:

Django recommande que la logique soit contenue dans les vues.

1
Simon