Changement de Django paramètres au moment de l'exécution

Je voudrais exposer quelques - (app) paramètres de l'interface d'administration, de sorte que les utilisateurs peuvent modifier confortablement et ne pas avoir à redémarrer Django.

Comment dois-je aller à ce sujet?

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

Les plus grands inconvénients, je vois qu'aucun des apps sont à la baisse-dans le remplacement pour l'ancien emplacement de ces paramètres (settings.py), et m'obliger à migrer à leur notation, et souvent ajouter un autre contexte, processeur d'accès dans les modèles.

Ne pouvais pas je viens de le faire?

  1. De créer un modèle pour mes réglages (ce qui me donne les différents types et validation)
  2. Instancier un objet de tenir mes paramètres (ce qui permet aux utilisateurs de les modifier dans l'interface d'admin) - je pourrais vidage par défaut comme des luminaires comme pour les autres modèles
  3. Wrap settings.py donc, il fait une requête de base de données pour les paramètres de mon - http://www.loose-bits.com/2011/04/extending-django-settings-with-derived.html

De mon présent, naïf point de vue, les seuls inconvénients que je vois serait:

  1. En ajoutant ou en modifiant les paramètres disponibles nécessite un schéma de migration (sud). - Je peux vivre avec ça.
  2. J'ai un modèle avec éventuellement plusieurs instances, mais vraiment seulement besoin d'un singleton. - Qui pourrait en fait être une fonction utile à un certain point.
  3. Performance/Cache: en Regardant http://code.djangoproject.com/svn/django/trunk/django/conf/ que je dois mettre un peu d'intelligence dans les paramètres de l'enveloppe et/ou d'un modèle, de sorte que les changements de modèle clair ou mettre à jour les valeurs mises en cache. - ne semble pas être la science de fusée.
  4. À faire de même dans un autre projet nécessiterait un effort similaire de nouveau. - Je pense qu'un seul dictionnaire constante dans settings.py, tenue le nom du modèle(s) et les noms de champ pour les recherches est tout ce qui serait différent.

Ne serait-ce pas le meilleur des deux mondes - runtime admin (avec tous ses avantages), base de données back-end, la mise en cache, et aucun de mes paramètres.USED_TO_BE_IN_SETTINGS_DOT_PY aurait besoin de tout changer. Ai-je raté quelque chose?

  • Si vous souhaitez utiliser django.conf.settings comme vous avez l'habitude il n'y a aucune façon vous pouvez obtenir ce que vous voulez, sauf le piratage Django lui-même. Vous devez migrer votre appel à au moins (code de la migration) pour utiliser les paramètres de l'objet fourni par la bibliothèque externe.
  • Merci pour votre commentaire. À l'aide d'un settings.py wrapper (voir URL) n'est pas le piratage Django lui-même à mon humble avis, de la même manière que settings.py sera de retour paramètres du projet (cependant, ils sont ensuite traités). L'ajout d'une autre application et la réécriture de l'ensemble des importations semble de plus en plus de travail qu'à mon approche, et je me demandais pourquoi cette approche ne serait pas suffisante ou ne pas faire ce que je suis en train de prédire...
  • Peut-être que j'ai mal compris vous, mais qui est l'exemple wrapper pas le même et vous avez encore à réécrire vos importations de paramètres? Je l'ai écrit d'une telle application il y a quelques temps (interne de l'entreprise, je suis donc malheureusement pas autorisés à sortir tout de suite), qui écrire un wrapper autour de paramètres. Au lieu de from django.conf import settings il serait alors from my_settings_app import settings dans mes applications qui l'utilisent. Dans ce cas, la dernière, c'est accéder à la db/cache et de secours aux réglages par défaut si les deux d'entre eux n'existent pas. N'est-ce pas ce que tu veux dire?
  • C'est ce que je veux dire, mais je n'ai pas encore de voir pourquoi je ne peux pas faire la même chose avec settings.py lui-même - c'est un module python.
  • Tu veux dire les paramètres de votre projet? Oui, bien sûr, vous pouvez le faire, si vous avez encore besoin de changer vos importations. Si vous n'avez toujours from django.conf import settings il aura le même effet qu'avant, sens d'importer les paramètres des objets de django/conf/__init__.py, qui est également à seulement un wrapper autour de vous fichier de paramètres de projet. Il n'est pas prévu pour l'envelopper d'un autre Objet selon le code. Nouveau: à l'exception de vous pirater Django lui-même.
  • siteconfig dans djblets juste monkeypatches paramètres - fait une fois au début, et puis à chaque fois qu'un changement de valeur: github.com/djblets/djblets/blob/master/djblets/siteconfig/... (chipx86.com/blog/2008/08/05/...) - n'est-ce pas possible?
  • Assurez-vous que fonctionne en quelque sorte. Je ne voudrais pas suggérer cette manière, puisque vous devez être sûr que tous les modules à l'aide de django paramètres sont importés (reloaded) à chaque fois les valeurs des paramètres sont modifiés (pour utiliser les nouveaux paramètres). Une fois que votre projet est plus grand il aura de la douleur pour ce faire.
  • Je crois que si les importations sont exactement les mêmes (à partir de django.conf paramètres d'importation), ils seront de partage le même objet, et ré-importer donc pas nécessaire. Encore, je suis d'accord c'est un peu trop de magie. Un récipient séparé pour les paramètres d'exécution de l'est (django-constance semble plus adaptée à mes besoins). Je souhaite que Django a un support intégré pour (éventuellement) les réglages dynamiques (par Site), et une séparation claire de l'immuable "paramètres du serveur". La documentation de qui (voir mon commentaire à André réponse) serait un premier pas, je suppose. Alors... ce genre de réponses à ma question 🙂
  • (Pour référence future) L'url dans la question n'est pas de travailler plus, mais un travail (comme maintenant) l'URL est djangopackages.com/grids/g/live-setting
  • Quelqu'un a sorti aujourd'hui: github.com/amdorra/django-kvmodel
  • Quelqu'un a une solution pour l'Administrateur et le Gestionnaire de la manipulation de paramètres?