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?
De mon point de vue actuel et naïf, les seuls inconvénients que je vois sont les suivants:
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?
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:
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é.
À partir de la documentation Django 1.8:
Vous ne devez pas modifier les paramètres de vos applications au moment de l'exécution.
DATABASES
est un dict. Vous pouvez donc manipuler comment un dictionnaire:
import Django.conf as conf
conf.settings.DATABASES['default']['NAME'] = 'novo_banco'
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à.
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.
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 .