2010-07-20 5 views
35

Où les fonctions d'utilitaires devraient-elles fonctionner dans Django? Fonctions telles que le cryptage/décryptage personnalisé, l'envoi de tweets, l'envoi d'e-mails, la vérification de la propriété d'un objet, la validation des entrées personnalisées, etc. Répétitives et personnalisées que j'utilise dans plusieurs applications de mon application. Je vais définitivement rompre DRY maintenant.Où les fonctions d'utilitaire devraient-elles vivre dans Django?

J'ai vu quelques démos où les fonctions étaient définies dans models.py, même si cela ne me semblait pas correct sur le plan conceptuel. Devraient-ils aller dans une application "utilitaires" qui est importée dans mon projet? Si oui, où vont-ils dans l'application des services publics? Le fichier models.py là?

Merci d'avoir aidé ce n00b.

MISE À JOUR: Laissez-moi être encore plus précis. Dites que j'ai besoin d'une fonction "light_encrypt (nombre)" qui prend le param "nombre", le multiplie par 7, ajoute 10 et renvoie le résultat, et une autre fonction "light_decrypt (encr_number) qui prend le param" encr_number ", soustrait 10, divise par 7 et renvoie les résultats Où dans mon arbre Django je mettrais ceci? Ce n'est pas un middleware, comme le suggère Felix, puis-je créer un paquet python et l'importer dans la vue où j'ai besoin de ces fonctions?

+1

Vous pouvez simplement créer un paquet Python normal. –

+1

connexes: http://stackoverflow.com/questions/3224902/django-what-is-the-most-ideal-place-to-store-project-specific-middleware/3224926#3224926 – eruciform

Répondre

19

différent question mais même réponse:

Ma mise en page habituelle pour un site django est:

projects/ 
templates/ 
common/ 
local/ 

Où:

  • projets contient votre projet principal et tous les autres
  • commune contient des choses que vous pouvez partager sur des sites, ou sont au moins pas spécifique au projet, comme si vous devez télécharger django-profil et django-enregistrement plutôt que de l'avoir directement dans python/site-packages
  • modèles contient juste que
  • local contient des choses qui vont être spécifiques à la machine actuelle, de sorte que vous pouvez avoir des données correctement séparées, comme l'emplacement de la base de données et mot de passe - Je puis lien logiciel le ver spécifique à la machine sions (disons "machine1-localconfig.py") en local/localconfig.py et puis "import localconfig" dans settings.py
  • Je place généralement un middleware spécifique au projet dans un projet, et un middleware qui n'est pas spécifique au projet en commun/middleware/
  • assurez-vous d'ajouter le répertoire des modèles au bon endroit dans les paramètres (ou plus probablement, localconfig.py et ensuite l'importer dans les paramètres), et assurez-vous d'ajouter les projets, les répertoires communs et locaux à votre PYTHONPATH.
+0

Merci pour la réponse, éruciforme. Donc, avec mon "light_encrypt (nombre)" exemple ci-dessus, vous suggéreriez que je mets cela en commun? – mitchf

+1

ouais, si vous allez l'utiliser dans un autre projet un jour, mieux vaut l'avoir dans 'common/util/encrypt.py' (ou quoi que ce soit) et assurez-vous qu'il n'a pas de liens internes vers quelque chose de spécifique au projet . il sera plus facile à réutiliser, et plus facile à mettre en communication si vous devez déplacer les choses plus tard. également juste plus propre du point de vue de la dissimulation des données. :-) – eruciform

+7

oh, si vous le placez dans 'common/util/encrypt.py', assurez-vous de toucher un 'common/util/__ init __. Py' vide de sorte que' from common.util.encrypt import light_encrypt' fonctionne correctement – eruciform

12

OK, après avoir lu les commentaires et de répondre ici, je l'ai décidé de créer un répertoire appelé « commune/util/» dans mon répertoire du projet. Au sein de ce que j'ai un fichier "__ init__.py" où j'ai mes fonctions de petite aide.

Je suppose que si le fichier devient trop volumineux, je diviserai ensuite les fonctions en fichiers .py communs. Alors maintenant, ma structure de projet ressemble à ceci. S'il vous plaît, corrigez si je fais de mauvais choix, je suis assez tôt dans le développement pour pouvoir le réparer maintenant alors que c'est encore facile à faire!

myproject/   (Django project) 
    common/ 
    util/ 
     __init__.py (helper functions) 
    middleware/  (custom middleware) 
    templates/  (project templates) 
    myapp/ 
    fixtures/  (initial data to load) 
    migrations/ (south migrations) 
    urls/ 
    views/ 
    admin.py 
    forms.py 
    models.py 
    test.py 

public/   (static stuff not served by Django) 
    media/ 
    css/ 
    img/ 
    js/ 
    lib/ 
+0

FWIW, je vois dans l'application django-profiles que ubernostrum a créé un fichier utils.py dans le même répertoire que urls.py et views.py pour contenir ses fonctions utilitaires – mitchf

+0

Pendant que je suis là. N'oubliez pas l'idiome courant dans python pour importer dans __init__.py les choses que vous voulez au niveau du module, mais pourrait/devrait vivre dans leur propre fichier pour la séparation. http://mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html est un bon article sur ce sujet. – Hylidan

1

Voici une autre façon de le faire:

Si les fonctions utilitaires peuvent être un module autonome et que vous utilisez un environnement virtualenv pour votre application django vous pouvez regrouper les fonctionnalités que un paquet et installez-le dans votre virtualenv.

Cela facilite l'importation là où vous en avez besoin dans votre application django.

+2

serait bien si vous avez montré comment faire un paquet facile – dalore