web-dev-qa-db-fra.com

Modification des paramètres de Django lors de l'exécution

J'aimerais exposer certains paramètres (spécifiques à une application) à l'interface d'administration, afin que les utilisateurs puissent les modifier facilement sans avoir à redémarrer Django.

Comment dois-je m'y prendre?

J'ai vérifié les applications sur http://djangopackages.com/grids/g/live-setting/ (btw Django-constance était le plus attrayant), mais toutes ces applications sont en train de stocker des valeurs dans une base de données , fournissant une interface Web pour les changer et la mise en cache. Les deux premières fonctionnalités ne sont-elles pas déjà intégrées à Django?

Les plus gros inconvénients que je constate sont qu’aucune des applications ne remplace directement l’ancien emplacement de ces paramètres (settings.py), et me demande de migrer vers leur notation, et ajoute souvent un autre processeur de contexte pour y accéder dans les modèles.

Ne pourrais-je pas faire ça?

  1. Créer un modèle pour mes réglages (cela me donne les différents types et validation)
  2. Instanciez l'un de ces objets pour conserver mes paramètres (cela permet aux utilisateurs de les éditer dans l'interface d'administration) - Je pourrais vider les valeurs par défaut comme des fixtures comme pour les autres modèles
  3. Enveloppez settings.py pour qu'il effectue une requête de base de données pour mes paramètres - http://www.loose-bits.com/2011/04/extending-Django-settings-with-derived.html

De mon point de vue actuel et naïf, les seuls inconvénients que je vois sont les suivants:

  1. L'ajout ou la modification des paramètres disponibles nécessite une migration de schéma (sud). - Je peux vivre avec ça.
  2. J'ai un modèle avec peut-être plusieurs instances mais je n'ai vraiment besoin que d'un singleton. - Cela pourrait effectivement être utile à un moment donné.
  3. Performances/Caching: En regardant http://code.djangoproject.com/svn/Django/trunk/Django/conf/ Je devrais mettre un peu d'ingéniosité dans les paramètres wrapper et/ou modèle, afin que les modifications de modèle effacent ou mettent à jour les valeurs mises en cache. - ne semble pas être sorcier.
  4. Faire la même chose dans un autre projet nécessiterait encore un effort similaire. - Je pense qu'une seule constante de dictionnaire dans settings.py, contenant le (s) nom (s) de modèle et les noms de champs pour les recherches, est tout ce qui pourrait différer.

Ne serait-ce pas le meilleur des deux mondes - administrateur d'exécution (avec tous ses avantages), base de données, mise en cache et aucun de mes paramètres.USED_TO_BE_IN_SETTINGS_DOT_PY n'aurait besoin d'être modifié. Est-ce que je manque quelque chose?

41
Danny W. Adair

Autant que je sache, les paramètres Django sont supposés être immuables. Il y a plusieurs raisons à cela, la plus évidente étant que Django n'est pas au courant du modèle d'exécution du serveur (prefork/multi-threaded).

En outre, vous ne pouvez pas charger les paramètres eux-mêmes à partir d'un modèle Django, car ils doivent être chargés avant de pouvoir utiliser quoi que ce soit dans l'ORM.

Donc, fondamentalement, vous avez deux solutions:

  • vous pouvez amorcer les paramètres à partir de la base de données en utilisant n'importe quel mécanisme d'accès de base de données de niveau inférieur pour les charger; ou
  • vous pouvez simplement définir vos paramètres dans un autre modèle et les récupérer directement lorsque vous en avez besoin.

Le premier est un hack incroyable et je ne le suggère pas. La seconde est beaucoup plus directe et plus propre, mais vous oblige à changer vos habitudes habituelles (from Django.conf import settings).

La deuxième approche est probablement ce qui est mis en œuvre par les applications tierces auxquelles vous êtes lié.

16
André Caron
9
Chuck

DATABASES est un dict. Vous pouvez donc manipuler comment un dictionnaire:

import Django.conf as conf

conf.settings.DATABASES['default']['NAME'] = 'novo_banco'
6
arannasousa

Honnêtement, je reçois plus de Django lorsque j'analyse son code. En version 1.4.5 l'a fait (en suivant le module ci-dessous):

  • monprojet\manage.py

  • Méthode Django\core\management__init __. Py ## - execute_manager

  • Django\conf__init __. Py ## class - LazySettings; attr - _wrapped

  • Django\utils\functional.py ## class LazyObject; méthode importante - new_method_proxy

Option fonctionnelle, mais elle comporte des risques. Dans le python "_" considère l'attribut comme protégé.

from Django.conf import settings

settings._wrapped.INSTALLED_APPS = () ## *really work*

Dans le projet suivant: https://github.com/alexsilva/DJPlugins , Vous pouvez voir que cette variable est modifiée au moment de l'exécution. l'idée du projet fonctionne déjà.

2
alex

Jetez un coup d'œil: https://bitbucket.org/bkroeze/Django-livesettings * Django-Livesettings est un projet séparé du Satchmo Project_. Il offre la possibilité de configurer les paramètres via une interface d'administration, plutôt qu'en modifiant "settings.py". *

Peut-être que cela peut vous être utile.

2
raphaelwct

Vous pouvez utiliser la méthode recommandée .configure() du module settings:

from Django.conf import settings
settings.configure(DEBUG=True)

Le module settings dispose de fonctionnalités pratiques supplémentaires. Vérifiez docs .

1
Fusion