J'ai développé une application de base. Maintenant, au stade du déploiement, il est devenu clair que j'ai besoin à la fois de paramètres locaux et de paramètres de production.
Ce serait formidable de savoir ce qui suit:
- Comment gérer au mieux les paramètres de développement et de production.
- Comment conserver des applications telles que django-debug-toolbar uniquement dans un environnement de développement.
- Tous les autres conseils et bonnes pratiques pour les paramètres de développement et de déploiement.
Réponses:
La
DJANGO_SETTINGS_MODULE
variable d'environnement contrôle le fichier de paramètres que Django chargera.Vous créez donc des fichiers de configuration séparés pour vos environnements respectifs (notez qu'ils peuvent bien sûr tous les deux à
import *
partir d'un fichier «de paramètres partagés» séparé), et utilisezDJANGO_SETTINGS_MODULE
pour contrôler lequel utiliser.Voici comment:
Comme indiqué dans la documentation Django:
Alors, supposons que vous avez créé
myapp/production_settings.py
etmyapp/test_settings.py
dans votre référentiel source.Dans ce cas, vous
DJANGO_SETTINGS_MODULE=myapp.production_settings
utiliseriez respectivement le premier etDJANGO_SETTINGS_MODULE=myapp.test_settings
le second.À partir de maintenant, le problème se résume à la définition de la
DJANGO_SETTINGS_MODULE
variable d'environnement.Réglage à l'
DJANGO_SETTINGS_MODULE
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 (en définissant l'environnement), ou courir juste de votre shell avant de lancer 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.Configuration à l'
DJANGO_SETTINGS_MODULE
aide d'un gestionnaire de processusSi vous n'aimez pas écrire un script bootstrap qui définit l'environnement (et il y a de très bonnes raisons de ressentir cela!), Je vous recommande d'utiliser un gestionnaire de processus:
environment
clé de configuration d' un programme ..env
fichier «environnement» ( ) .Enfin, notez que vous pouvez profiter de la
PYTHONPATH
variable pour stocker les paramètres dans un emplacement complètement différent (par exemple sur un serveur de production, en les stockant/etc/
). Cela permet de séparer la configuration des fichiers d'application. Vous pouvez ou non vouloir cela, cela dépend de la structure de votre application.la source
settings.py
fichier est stockéSiteName/settings.py
par défaut, si vous placez vos fichiers de paramètres alternatifs dans le même répertoire, la ligne ajoutée à bin / activate devrait se lireDJANGO_SETTINGS_MODULE="SiteName.test_settings"
Sinon, excellente réponse!DJANGO_SETTINGS_MODULE
pour choisir celui que vous souhaitez utiliser. La modificationbin/activate
est de faire ce dernier (TBH, je ne pense plus que ce soit une bonne idée de toute façon, alors je l'ai retiré), mais ce n'est pas la seule.Par défaut, utilisez les paramètres de production, mais créez un fichier appelé
settings_dev.py
dans le même dossier que votresettings.py
fichier. Ajoutez-y des remplacements, tels queDEBUG=True
.Sur l'ordinateur qui sera utilisé pour le développement, ajoutez ceci à votre
~/.bashrc
fichier:Au bas de votre
settings.py
fichier, ajoutez ce qui suit.(Notez que l'importation
*
doit généralement être évitée en Python)Par défaut, les serveurs de production ne remplaceront rien. Terminé!
Par rapport aux autres réponses, celle-ci est plus simple car elle ne nécessite pas de mise à jour
PYTHONPATH
, ni de paramétrageDJANGO_SETTINGS_MODULE
qui ne vous permet de travailler que sur un seul projet django à la fois.la source
if os.environ.get('DJANGO_DEVELOPMENT', 'true')
fonctionne également. Je mentionne cela uniquement parce que lais not true
méthode ci-dessus n'a pas pu être importée pour moi sur Python 3.6.DEV
paramètres qui feront fuir des données privées sur un serveur public. Vous voulez vraiment juste vérifier que laDJANGO_DEVELOPMENT
variable d'environnement existe (ieis not None
).settings_dev.py
chargement sur le serveur.is not None
chèque. Est aussios.getenv
la sténographieJ'ai généralement un fichier de paramètres par environnement et un fichier de paramètres partagé:
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 cette strophe).
Je sélectionne ensuite les fichiers de paramètres à utiliser en le liant à settings.py:
la source
import *
? Désactivez-vous cette vérification? J'ai enveloppé cette importation dans un,exec()
mais je ne peux pas avoir de conditions sur des variables qui ne sont pas définies dans ce fichier, ni modifier laINSTALLED_APPS
variable car elle est "indéfinie"Voici comment je le fais en 6 étapes faciles:
Créez un dossier dans le répertoire de votre projet et nommez-le
settings
.Structure du projet:
Créez quatre fichiers python intérieur du
settings
répertoire à savoir__init__.py
,base.py
,dev.py
etprod.py
Fichiers de paramètres:
Ouvrez
__init__.py
et remplissez-le avec le contenu suivant:init .py:
Ouvrez-le
base.py
et remplissez-le avec tous les paramètres communs (qui seront utilisés à la fois en production et en développement.) Par exemple:base.py:
Ouvrez
dev.py
et incluez ce qui est spécifique au développement, par exemple:dev.py:
Ouvrez
prod.py
et incluez ce qui est spécifique à la production, par exemple:prod.py:
la source
Créez plusieurs
settings*.py
fichiers en extrapolant les variables qui doivent changer par environnement. Puis à la fin de votresettings.py
fichier maître :Vous conservez les
settings_*
fichiers séparés pour chaque étape.En haut de votre
settings_dev.py
fichier, ajoutez ceci:Pour importer des variables que vous devez modifier.
Cette entrée wiki a plus d'idées sur la façon de diviser vos paramètres.
la source
settings_prod.py
modname = "%s.settings" % ".".join(__name__.split('.')[:-1])
pour obtenir le nom complet du module, puisglobals().update(vars(sys.modules[modname]))
. Je trouve que cela fonctionne bien pour moi. Bien sûr, renoncer à la détermination par programme du nom du module en faveur d'une chaîne fonctionnerait probablement également dans la plupart des cas.J'utilise les super django-configurations , et tous les paramètres sont stockés dans mon
settings.py
:Pour configurer le projet Django, j'ai juste suivi la documentation .
la source
Voici l'approche que nous utilisons:
settings
module pour diviser les paramètres en plusieurs fichiers pour une meilleure lisibilité;.env.json
fichier pour stocker les informations d'identification et les paramètres que nous voulons exclure de notre référentiel git, ou qui sont spécifiques à l'environnement;env.py
fichier pour 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 le développement, la mise en scène et la production;J'espère que cela vous aidera, faites-moi savoir si vous voyez des mises en garde avec cette solution.
la source
env
remplacer pardev
,prod
etc.? Que contient l'anciensettings.py
fichier? Qu'est-ce qu'il y astorage.py
etdatabase.py
?env.py
fichier afin de pouvoir choisir, avec une variable d'environnement, quel fichier chargerJ'utilise la structure de fichier suivante:
Donc ,
__init__.py
est un lien (ln dans unix ou mklink dans les fenêtres) àlocal.py
ou peut être àprod.py
si la configuration est encore dans leproject.settings
module est propre et bien organisé, et si vous souhaitez utiliser une configuration particulière , vous pouvez utiliser la variable d'environnementDJANGO_SETTINGS_MODULE
àproject.settings.prod
si vous avez besoin pour exécuter une commande pour l'environnement de production.Dans les fichiers
prod.py
etlocal.py
:et le
shared.py
fichier reste global sans configs spécifiques.la source
en s'appuyant sur la réponse de cs01:
si vous rencontrez des problèmes avec la variable d'environnement, définissez sa valeur sur une chaîne (par exemple, je l'ai fait
DJANGO_DEVELOPMENT="true"
).J'ai également modifié le flux de travail des fichiers de cs01 comme suit:
De cette façon, Django n'a pas besoin de lire l'intégralité d'un fichier de paramètres avant d'exécuter le fichier de paramètres approprié. Cette solution est pratique si votre fichier de production a besoin d'éléments qui se trouvent uniquement sur votre serveur de production.
Remarque: dans Python 3, les fichiers importés doivent avoir un
.
ajout (par exemplefrom .settings_dev import *
)la source
Si vous souhaitez conserver 1 fichier de paramètres et que votre système d'exploitation de développement est différent de votre système d'exploitation de production, vous pouvez le placer en bas de votre settings.py:
En savoir plus: Comment vérifier le système d'exploitation en Python?
la source
Cela semble avoir été répondu, mais une méthode que j'utilise combinée avec le contrôle de version est la suivante:
Configurez un fichier env.py dans le même répertoire que les paramètres de mon environnement de développement local que j'ajoute également à .gitignore:
env.py:
.gitignore:
settings.py:
Je trouve que cela fonctionne et est beaucoup plus élégant - avec env.py, il est facile de voir nos variables d'environnement local et nous pouvons gérer tout cela sans plusieurs fichiers settings.py ou autres. Cette méthode permet d'utiliser toutes sortes de variables d'environnement locales que nous ne voudrions pas définir sur notre serveur de production. En utilisant le .gitignore via le contrôle de version, nous gardons également tout intégré de manière transparente.
la source
Config
classe à l'intérieur d'unenv.py
fichier. Ensuite, au lieu d'unimport *
, le module peut être importé parfrom env import Config
. De cette façon, vous n'avez pas non plus besoin de l'utiliser sios.path
vous vérifiez ce qui rend tout cela beaucoup plus simple.Utiliser
settings.py
pour la production. Dans le même répertoire, créezsettings_dev.py
pour les remplacements.Sur une machine de développement, exécutez votre application Django avec:
Sur une machine prod, exécutez comme si vous venez de l'avoir
settings.py
et rien d'autre.AVANTAGES
settings.py
(utilisé pour la production) est totalement indépendant du fait que d'autres environnements existent même.settings_dev.py
. Pas besoin de rassembler des configurations dispersées à traverssettings_prod.py
,settings_dev.py
etsettings_shared.py
.la source
Pour le problème de paramétrage des fichiers, je choisis de copier
Lorsque vous exécutez django, __init__py sera exécuté. En ce moment ,
settings.py in setting1_dir
remplacerasettings.py in Project
.Comment choisir différents env?
__init__.py
directement.__init__.py
.__init__.py
lire cette variable.Pourquoi utiliser de cette façon?
Parce que je n'aime pas autant de fichiers dans le même répertoire, trop de fichiers confondront les autres partenaires et pas très bien pour l'IDE. (IDE ne peut pas trouver quel fichier nous utilisons)
Si vous ne voulez pas voir tous ces détails, vous pouvez diviser le projet en deux parties.
la source
J'utilise un fichier app.yaml différent pour modifier la configuration entre les environnements dans le moteur d'application Google Cloud.
Vous pouvez l'utiliser pour créer une connexion proxy dans votre commande de terminal:
https://cloud.google.com/sql/docs/sqlserver/connect-admin-proxy#macos-64-bit
Fichier: app.yaml
la source
C'est ma solution, avec différents environnements de développement, de test et de production
la source