Django: Comment gérer le développement et la production de paramètres?
J'ai été le développement d'une application de base. Maintenant à la phase de déploiement, il est devenu clair que j'ai besoin à la fois d'un local, les paramètres et les paramètres de production.
Il serait intéressant de connaître les éléments suivants:
- La meilleure façon de traiter avec le développement et les paramètres de production.
- Comment garder apps comme django-debug-toolbar seulement dans un environnement de développement.
- Tout autres conseils et meilleures pratiques pour le développement et les paramètres de déploiement.
- Coup d'oeil ici: stackoverflow.com/questions/88259/... et voilà code.djangoproject.com/wiki/SplitSettings
Vous devez vous connecter pour publier un commentaire.
La
DJANGO_SETTINGS_MODULE
variable d'environnement contrôles des paramètres de fichier de Django charge.Vous donc de créer des fichiers de configuration pour vos environnements respectifs (à noter qu'elles peuvent à la fois
import *
à partir d'une autre, "partagé" paramètres du fichier), et l'utilisationDJANGO_SETTINGS_MODULE
de contrôle à utiliser.Voici comment:
Comme indiqué dans la documentation de Django:
Ainsi, supposons que vous avez créé
myapp/production_settings.py
etmyapp/test_settings.py
dans le référentiel source.Dans ce cas, vous feriez respectivement de régler
DJANGO_SETTINGS_MODULE=myapp.production_settings
à utiliser l'ancien etDJANGO_SETTINGS_MODULE=myapp.test_settings
à utiliser celui-ci.À partir de maintenant, le problème se résume à la définition de la
DJANGO_SETTINGS_MODULE
variable d'environnement.Réglage
DJANGO_SETTINGS_MODULE
à l'aide d'un script ou d'un shellVous pouvez ensuite utiliser un script d'amorçage ou d'un gestionnaire de processus pour charger les paramètres corrects (par la définition de l'environnement), ou l'exécuter à partir de votre shell avant de commencer Django:
export DJANGO_SETTINGS_MODULE=myapp.production_settings
.Notez que vous pouvez exécuter cette exportation à tout moment à partir d'un shell — il n'a pas besoin de vivre dans votre
.bashrc
ou quoi que ce soit.Réglage
DJANGO_SETTINGS_MODULE
à l'aide d'un Gestionnaire de ProcessusSi vous n'êtes pas friands de l'écriture d'un script bootstrap qui définit l'environnement (et il y a de très bonnes raisons de se sentir de cette façon!), Je vous conseille d'utiliser un gestionnaire de processus:
environnement
clé de configuration..env
) fichier.Enfin, notez que vous peut profiter de la
PYTHONPATH
variable pour stocker les paramètres dans un tout autre endroit (par exemple, sur un serveur de production, de les stocker dans/etc/
). Cela permet de séparer la configuration à partir des fichiers de l'application. Vous pouvez ou ne voulez pas, tout dépend de la façon dont votre application est structurée.settings.py
fichier est stocké dansSiteName/settings.py
par défaut, si vous placez vos autres fichiers de paramètres dans le même répertoire que la ligne ajoutée à bin/activate devrait lireDJANGO_SETTINGS_MODULE="SiteName.test_settings"
Sinon excellente réponse!DJANGO_SETTINGS_MODULE
à choisir celui que vous souhaitez utiliser. La modification debin/activate
est l'un de ces derniers (TBH, je n'ai plus que c'est une bonne idée de toute façon, donc je l'ai fait), mais ce n'est pas le seul.Par défaut pour utiliser les paramètres de production, mais de créer un fichier appelé
settings_dev.py
dans le même dossier que votresettings.py
fichier. Ajouter remplace là, commeDEBUG=True
.Sur l'ordinateur qui sera utilisé pour le développement, ajoutez ceci à votre
~/.bashrc
fichier:Au bas de votre
settings.py
fichier, ajoutez la ligne suivante.(Noter que l'importation de
*
doit généralement être évitée en Python, mais c'est un cas unique)Par défaut, les serveurs de production ne sera pas remplacer quoi que ce soit. Fait!
Par rapport aux autres réponses, c'est plus simple car elle ne nécessite pas de mise à jour
PYTHONPATH
, ou la mise enDJANGO_SETTINGS_MODULE
qui ne vous permet de travailler sur un projet django à la fois.if os.environ.get('DJANGO_DEVELOPMENT', 'true')
fonctionne également. J'en parle uniquement parce que le ci-dessusis not true
méthode a échoué à l'importation pour moi sur Python 3.6.DEV
paramètres de fuite de données privées sur un serveur public. Vraiment vous voulez juste pour vérifier que leDJANGO_DEVELOPMENT
variable d'environnement existe (c'est à direis not None
).settings_dev.py
était en train de charger sur le serveur.is not None
vérifier. Aussios.getenv
est l'abréviationJ'ai habituellement un fichier de paramètres par l'environnement, et un fichier de paramètres partagés:
Chacun de mes fichiers d'environnement a:
Cela me permet de remplacer les paramètres partagés si nécessaire (en ajoutant les modifications ci-dessous que la strophe).
Je puis sélectionnez les fichiers de paramètres à utiliser en le reliant à settings.py:
import *
? Avez-vous désactivez cette case? J'ai enroulé de l'importation dans unexec()
mais ensuite je ne peux pas avoir des conditions sur les variables qui ne sont pas définis dans ce fichier, je ne peux modifierINSTALLED_APPS
variable parce que c'est "undefined"C'est comment je le faire en 6 étapes faciles:
Créer un dossier à l'intérieur de votre projet, le répertoire et le nom
settings
.structure de projet:
Créer quatre fichiers python à l'intérieur de la
settings
répertoire à savoir__init__.py
,base.py
,dev.py
etprod.py
fichiers de paramètres:
Ouvrir
__init__.py
et de le remplir avec le contenu suivant:__init__.py:
Ouvrir
base.py
et de le remplir avec tous les paramètres communs (qui sera utilisé dans la production ainsi que le développement.) par exemple:base.py:
Ouvrir
dev.py
et de l'inclure stuff, qui est un développement spécifique par exemple:dev.py:
Ouvrir
prod.py
et comprennent ce genre de choses qui est de la production spécifique par exemple:prod.py:
Créer plusieurs
settings*.py
fichiers, en extrapolant les variables qu'il faut changer par l'environnement. Puis à la fin de votre maîtresettings.py
fichier:Vous garder séparés
settings_*
fichiers pour chaque étape.En haut de votre
settings_dev.py
fichier, ajouter ceci:Pour importer des variables que vous devez modifier.
Ce entrée wiki a plus d'idées sur la façon de diviser vos paramètres.
settings_prod.py
modname = "%s.settings" % ".".join(__name__.split('.')[:-1])
pour obtenir le plein nom du module et ensuiteglobals().update(vars(sys.modules[modname]))
. Je trouve qui fonctionne très bien pour moi. Bien sûr que l'on renonce à peu sur par programme à déterminer le nom du module en faveur d'une chaîne serait probablement travailler dans la plupart des cas.Ici est l'approche que nous utilisons :
settings
module de paramètres de split en plusieurs fichiers pour des raisons de lisibilité ;.env.json
fichier pour stocker les informations d'identification et les paramètres que nous voulons exclus de notre dépôt git, ou qui sont spécifiques d'environnement ;env.py
fichier à lire le.env.json
fichierCompte tenu de la structure suivante :
Avec
.env.json
comme :Et
project_name/env.py
:Nous pouvons avoir les paramètres suivants:
les avantages de cette solution sont :
.env.json
comme dev, stagging et de la production ;J'espère que cette aide, laissez-moi savoir si vous voyez des mises en garde avec cette solution.
env
est à remplacer pardev
,prod
etc.? Ce qui se passe dans la vieillesettings.py
fichier? Ce qui est dansstorage.py
etdatabase.py
?env.py
fichier, de sorte que vous pouvez choisir, avec une variable d'environnement, le fichier à charger- Je utiliser le génial django-configurations, et tous les paramètres sont stockés dans mon
settings.py
:Pour configurer le projet Django j'ai simplement suivi le docs.
construction d'cs01 réponse:
si vous rencontrez des problèmes avec la variable d'environnement, de définir sa valeur à une chaîne de caractères (par exemple, je n'ai
DJANGO_DEVELOPMENT="true"
).J'ai aussi changé cs01 du fichier de flux de travail comme suit:
De cette façon, Django n'a pas de lire l'intégralité d'un fichier de paramètres avant de lancer les paramètres appropriés de fichier. Cette solution est très pratique si votre fichier de production les besoins de trucs qui sont seulement sur votre serveur de production.
Remarque: en Python 3, les fichiers importés doivent avoir une
.
ajoutée (par exemple,from .settings_dev import *
)- Je utiliser le folloring structure de fichier:
Donc
__init__.py
est un lien (ln dans unix ou mklink dans windows) pourlocal.py
ou peut être àprod.py
de sorte que la configuration est encore dans leproject.settings
module est propre et bien organisé, et si vous souhaitez utiliser une configuration spécifique, vous pouvez utiliser la variable d'environnementDJANGO_SETTINGS_MODULE
àproject.settings.prod
si vous avez besoin d'exécuter une commande pour un environnement de production.Dans les fichiers
prod.py
etlocal.py
:et la
shared.py
fichier conserve mondiale sans configs.Si vous voulez garder 1 fichier de paramètres, et le développement de votre système d'exploitation est différent de celui de votre production, système d'exploitation, vous pouvez le placer au fond de votre settings.py:
Lire la suite: Comment puis-je vérifier le système d'exploitation en Python?
Cela semble avoir été entendu, toutefois, une méthode que j'utilise en combinaison avec le contrôle de version est le suivant:
L'installation d'un env.py fichier dans le même répertoire que les paramètres sur mon environnement local de développement que j'ai aussi ajouter à .gitignore:
env.py:
.gitignore:
settings.py:
Je viens de trouver ce qui fonctionne et est beaucoup plus élégant - avec env.py il est facile de voir notre environnement local des variables et nous pouvons gérer tout cela sans que plusieurs settings.py les fichiers ou les goûts. Cette méthode permet toutes sortes de locaux des variables d'environnement pour être utilisés que nous ne voulons pas mettre en place sur notre serveur de production. En utilisant l' .gitignore via le contrôle de version, nous sommes également en gardant tout parfaitement intégré.
Config
classe à l'intérieur deenv.py
fichier. Alors, au lieu d'unimport *
, le module peut être importé parfrom env import Config
. De cette façon, vous n'avez pas besoin de l'utiliser sios.path
vérifier ce qui rend toute cette chose beaucoup plus simple.Utilisation
settings.py
pour la production. Dans le même répertoire créersettings_dev.py
pour des remplacements.Sur une machine de dev exécuter votre Django app avec:
Sur une prod de la machine comme si vous veniez
settings.py
et rien d'autre.AVANTAGES
settings.py
(utilisé pour la production) est complètement agnostique au fait que tous les autres environnements existent encore.settings_dev.py
. Pas besoin de recueillir des configurations dispersés à traverssettings_prod.py
,settings_dev.py
etsettings_shared.py
.C'est ma solution, avec différents environements pour les dev, test et prod