2009-07-12 9 views
9

J'ai un grand tableau, que je voudrais charger en mémoire seulement une fois quand django démarre et le traiter comme une variable globale en lecture seule. Quel est le meilleur endroit pour mettre le code pour l'initialisation de ce tableau? Si je le mets dans settings.py, il sera réinitialisé chaque fois que le module de paramètres est importé, correct?Initialisation Django

Répondre

9

settings.py est le bon endroit pour cela. Settings.py est, comme tout autre module, chargé une fois. Il y a toujours le problème du fait qu'un module doit être importé une fois pour chaque processus, ainsi un style de resweing de serveur web (comme Apache) le rechargera une fois pour chaque instance en question. Pour mod_python, ce sera une fois par processus. pour mod_wsgi, il est probable que ce soit une seule fois, sauf si vous devez redémarrer. Tl; les modules dr sont importés une seule fois, même si plusieurs instructions d'importation sont utilisées. le mettre dans settings.py

+2

Pour mod_wsgi, ce sera aussi une fois par processus pour cette instance de Django. Le nombre de processus dépend de l'utilisation du mode embarqué ou du mode démon et donc du nombre de processus exécutés par votre instance Django. Pour plus de détails sur les différents modes de fonctionnement de mod_wsgi, voir 'http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading'. –

+0

L'initialisation dans settings.py entraîne souvent des problèmes d'importation circulaire. Je me suis souvent battu avec cela et je préviens quiconque de faire cela à propos des importations circulaires. –

15

settings.py est pour les paramètres Django; il est bien d'y mettre vos propres paramètres, mais l'utiliser pour des structures de données sans configuration arbitraire n'est pas une bonne pratique. Il suffit de le placer dans le module auquel il appartient logiquement, et il ne sera exécuté qu'une seule fois par instance. Si vous voulez garantir que le module est chargé au démarrage et non lors de la première utilisation ultérieure, importez ce module depuis le niveau supérieur __init__.py pour le forcer à être chargé immédiatement.

+5

Cela devrait être la réponse acceptée –

+0

Mais que se passe-t-il si ce code d'initialisation __init__.py dépend de certains paramètres? –

Questions connexes