J'ai un "produit" assez complexe que je me prépare à construire avec Django. Je vais éviter d'utiliser les termes "projet" et "application" dans ce contexte, car je ne suis pas clair sur leur signification spécifique dans Django.
Les projets peuvent avoir de nombreuses applications. Les applications peuvent être partagées entre de nombreux projets. Bien.
Je ne réinvente pas le blog ou le forum - je ne vois aucune portion de mon produit réutilisable dans n'importe quel contexte. Intuitivement, j'appellerais celle-ci «application». Dois-je ensuite faire tout mon travail dans un seul dossier "app"?
Si c'est le cas ... en termes d' project.app
espace de noms de Django , mon inclination est d'utiliser myproduct.myproduct
, mais bien sûr ce n'est pas autorisé (mais l'application que je construis est mon projet, et mon projet est une application!). Je suis donc amené à croire que je suis peut-être censé approcher Django en créant une application par modèle "significatif", mais je ne sais pas où tracer les limites de mon schéma pour le séparer en applications - j'en ai beaucoup de modèles avec des relations relativement complexes.
J'espère qu'il y a une solution commune à cela ...
Réponses:
Qu'est-ce qui vous empêche d'utiliser
myproduct.myproduct
? Ce dont vous avez besoin pour y parvenir consiste grosso modo à faire ceci:etc. Serait-il utile que je dise
views.py
qu'il ne faut pas appelerviews.py
? À condition que vous puissiez nommer, sur le chemin python, une fonction (généralement package.package.views.function_name) qu'elle sera gérée. Aussi simple que cela. Tous ces trucs «projet» / «app» ne sont que des paquets python.Maintenant, comment êtes-vous censé le faire? Ou plutôt, comment pourrais-je le faire? Eh bien, si vous créez un élément important de fonctionnalités réutilisables, comme dire un éditeur de balisage, qui est lorsque vous créez une « application de haut niveau » qui pourrait contenir
widgets.py
,fields.py
,context_processors.py
etc. - toutes les choses que vous voudrez peut - être importer.De même, si vous pouvez créer quelque chose comme un blog dans un format assez générique entre les installations, vous pouvez le terminer dans une application, avec son propre modèle, un dossier de contenu statique, etc., et configurer une instance d'un projet django pour l'utiliser. le contenu de l'application.
Il n'y a pas de règles strictes et rapides disant que vous devez le faire, mais c'est l'un des objectifs du cadre. Le fait que tout, y compris les modèles, vous permet d'inclure à partir d'une base commune signifie que votre blog doit s'intégrer parfaitement dans toute autre configuration, simplement en prenant soin de sa propre partie.
Cependant, pour répondre à votre préoccupation réelle, rien ne dit que vous ne pouvez pas travailler avec le dossier de projet de niveau supérieur. C'est ce que font les applications et vous pouvez le faire si vous le souhaitez vraiment. Cependant, je n'ai pas tendance à le faire pour plusieurs raisons:
website
. Cependant, à une date ultérieure, je souhaiterais peut-être développer des fonctionnalités originales uniquement pour ce site. En vue de le rendre amovible (que je le fasse ou non), j'ai tendance à créer un répertoire séparé. Cela signifie également que je peux supprimer cette fonctionnalité simplement en dissociant ce package de la configuration et en supprimant le dossier, plutôt que de supprimer de manière complexe les bonnes URL d'un dossier global urls.py.En bref, la raison pour laquelle il existe une convention est la même que n'importe quelle autre convention - cela aide quand il s'agit d'autres personnes travaillant avec votre projet. Si je vois,
fields.py
je m'attends immédiatement à ce qu'il contienne du code pour sous-classer le champ de django, alors que si je vois,inputtypes.py
je ne serais peut-être pas aussi clair sur ce que cela signifie sans le regarder.la source
manage.py
, ce qui l'empêche d'importer correctement les paramètres de votre projet. Cela m'est arrivé, et je l'ai résolu en refactorisant l'application à l'effet demyproduct_app
.Une fois que vous avez terminé l'utilisation de
startproject
etstartapp
, rien ne vous empêche de combiner un "projet" et une "application" dans le même package Python. Un projet n'est vraiment rien de plus qu'unsettings
module, et une application n'est vraiment rien de plus qu'unmodels
module - tout le reste est facultatif.Pour les petits sites, il est tout à fait raisonnable d'avoir quelque chose comme:
la source
INSTALLED_APPS
liste. Voici un exemple: stackoverflow.com/a/59739912/399435J'ai lu cette pensée quelque part peu de temps après avoir commencé à travailler avec Django et je trouve que je me pose cette question assez souvent et cela m'aide.
Vos applications n'ont pas besoin d'être réutilisables, elles peuvent dépendre les unes des autres, mais elles devraient faire une chose.
la source
J'ai trouvé les articles de blog suivants très utiles sur les applications et les projets django:
En principe, vous disposez d'une grande liberté avec django pour organiser le code source de votre produit.
la source
Il n'y a rien de tel que non autorisé. C'est votre projet, personne ne vous restreint. Il est conseillé de garder un nom raisonnable.
Dans un projet Django général, il existe de nombreuses applications (applications contrib) qui sont vraiment utilisées dans chaque projet.
Disons que votre projet ne fait qu'une seule tâche et n'a qu'une seule application (je le nomme
main
car le projet tourne autour de lui et est à peine enfichable). Ce projet utilise également toujours d'autres applications en général.Maintenant, si vous dites que votre projet utilise uniquement la seule application (
INSTALLED_APPS='myproduct'
), alors à quoi sert deproject
définir le projet en tant queproject.app
, je pense que vous devriez considérer certains points:En ce qui concerne la plupart du travail effectué dans l'application, je pense que c'est le cas avec la plupart des projets django.
la source
main
convention - cela a beaucoup de sens pour moi pour un projet original comme celui-ci. Je prévois d'ajouter des applications "réutilisables" plus tard, mais c'est en dehors de mon objectif en ce moment.Ici, les créateurs de Django soulignent eux-mêmes cette différence . Je pense que la réflexion sur Apps comme ils doivent être réutilisables dans d' autres projets est bon . Une bonne façon de penser aux applications dans Django fournit également des applications Web modernes.
Imaginez que vous créez une grande application Web dynamique basée sur JavaScript .
Vous pouvez ensuite créer dans l'application django nommée par exemple "FrontEnd" <- dans l'application fine, vous afficherez le contenu.
Ensuite, vous créez des applications backend. Par exemple, une application nommée "Commentaires" qui stockera les commentaires des utilisateurs. Et l'application "Commentaires" n'affichera rien elle-même. Ce sera juste une API pour les demandes AJAX de votre site Web JS dynamique .
De cette façon, vous pouvez toujours réutiliser votre application "Commentaires". Vous pouvez le rendre open source sans ouvrir la source de l'ensemble du projet. Et vous gardez une logique propre de votre projet.
la source