J'ai tendance à utiliser SQLite lorsque je fais du développement Django , mais sur un serveur live, quelque chose de plus robuste est souvent nécessaire ( MySQL / PostgreSQL , par exemple). Invariablement, il y a également d'autres changements à apporter aux paramètres de Django: différents emplacements / intensités de journalisation, chemins multimédias, etc.
Comment gérez-vous tous ces changements pour faire du déploiement un processus simple et automatisé?
Réponses:
Mise à jour: django-configurations a été publié, ce qui est probablement une meilleure option pour la plupart des gens que de le faire manuellement.
Si vous préférez faire les choses manuellement, ma réponse précédente s'applique toujours:
J'ai plusieurs fichiers de paramètres.
settings_local.py
- configuration spécifique à l'hôte, telle que le nom de la base de données, les chemins de fichiers, etc.settings_development.py
- configuration utilisée pour le développement, par exempleDEBUG = True
.settings_production.py
- configuration utilisée pour la production, par exempleSERVER_EMAIL
.Je les lie tous ensemble avec un
settings.py
fichier qui importe d'abordsettings_local.py
, puis l'un des deux autres. Il décide lequel charger par deux paramètres à l'intérieursettings_local.py
-DEVELOPMENT_HOSTS
etPRODUCTION_HOSTS
.settings.py
appelleplatform.node()
pour trouver le nom d'hôte de la machine sur laquelle il s'exécute, puis recherche ce nom d'hôte dans les listes et charge le deuxième fichier de paramètres en fonction de la liste dans laquelle il trouve le nom d'hôte.De cette façon, la seule chose dont vous devez vraiment vous soucier est de garder le
settings_local.py
fichier à jour avec la configuration spécifique à l'hôte, et tout le reste est géré automatiquement.Découvrez un exemple ici .
la source
_local
plutôt déroutant) et le fait que vous n'utilisez pas de modules (paramètres /base.py, settings / local.py, settings / production.py). Il serait également sage de conserver cela dans un référentiel séparé ... mieux encore, un service sécurisé qui sert ces informations à partir d'une source canonique (probablement exagérée pour la plupart) ... afin que le nouvel hôte ne nécessite pas une nouvelle version..py
fichier et de donner ainsi à chaque hôte l'accès aux informations sur la configuration de tous les autres hôtes, vous pouvez créer un modèle de manage.py pour utiliser les paramètres appropriés fichier dans vos configurations de déploiement.Personnellement, j'utilise un seul settings.py pour le projet, je lui demande juste de rechercher le nom d'hôte sur lequel il se trouve (mes machines de développement ont des noms d'hôte qui commencent par "gabriel" donc j'ai juste ceci:
puis dans d'autres parties, j'ai des choses comme:
etc. Un peu moins lisible, mais cela fonctionne bien et évite d'avoir à jongler avec plusieurs fichiers de paramètres.
la source
À la fin de settings.py, j'ai ce qui suit:
De cette façon, si je veux remplacer les paramètres par défaut, je dois simplement placer settings_local.py juste à côté de settings.py.
la source
settings_local
entraîne unImportError
, celaexcept
va l'avaler en silence.No module named...
vscannot import name...
, mais il est fragile. Ou, placez vos importations dans settings_local.py dans try blocks et soulevez une exception plus spécifique:MisconfiguredSettings
ou quelque chose dans ce sens.J'ai deux fichiers.
settings_base.py
qui contient les paramètres communs / par défaut et qui est archivé dans le contrôle de code source. Chaque déploiement a un autresettings.py
, qui s'exécutefrom settings_base import *
au début, puis remplace si nécessaire.la source
settings_local.py
tel est le casfrom settings import *
, il peut remplacer les valeurs danssettings.py
. (lesettings_local.py
fichier doit être importé à la fin desettings.py
).Le moyen le plus simple que j'ai trouvé était:
1) utilisez les paramètres par défaut.py pour le développement local et 2) créez un fichier production-settings.py commençant par:
Et puis remplacez simplement les paramètres qui diffèrent en production:
la source
Un peu lié, pour le problème du déploiement de Django lui-même avec plusieurs bases de données, vous voudrez peut-être jeter un œil à Djangostack . Vous pouvez télécharger un programme d'installation entièrement gratuit qui vous permet d'installer Apache, Python, Django, etc. Dans le cadre du processus d'installation, nous vous permettons de sélectionner la base de données que vous souhaitez utiliser (MySQL, SQLite, PostgreSQL). Nous utilisons beaucoup les installateurs lors de l'automatisation des déploiements en interne (ils peuvent être exécutés en mode sans assistance).
la source
J'ai mon fichier settings.py dans un répertoire externe. De cette façon, il n'est pas archivé dans le contrôle de code source ou écrasé par un déploiement. Je mets ceci dans le fichier settings.py sous mon projet Django, avec tous les paramètres par défaut:
Remarque: Ceci est très dangereux si vous ne pouvez pas faire confiance à local_settings.py.
la source
En plus des multiples fichiers de paramètres mentionnés par Jim, j'ai également tendance à placer deux paramètres dans mon fichier settings.py en haut
BASE_DIR
et àBASE_URL
définir le chemin du code et l'URL vers la base du site, tous les autres paramètres sont modifiés pour s'y ajouter.BASE_DIR = "/home/sean/myapp/"
par exempleMEDIA_ROOT = "%smedia/" % BASEDIR
Ainsi, lors du déplacement du projet, je n'ai qu'à modifier ces paramètres et non à rechercher l'ensemble du fichier.
Je recommanderais également de regarder fabric et Capistrano (outil Ruby, mais il peut être utilisé pour déployer des applications Django) qui facilitent l'automatisation du déploiement à distance.
la source
Eh bien, j'utilise cette configuration:
À la fin de settings.py:
Et dans locale_settings.py:
la source
Tant de réponses compliquées!
Chaque fichier settings.py est livré avec:
J'utilise ce répertoire pour définir la variable DEBUG comme ceci (remplacez-le avec le directoy où se trouve votre code de développement):
Ensuite, chaque fois que le fichier settings.py est déplacé, DEBUG sera False et c'est votre environnement de production.
Chaque fois que vous avez besoin de paramètres différents de ceux de votre environnement de développement, utilisez simplement:
la source
Je pense que cela dépend de la taille du site pour savoir si vous devez abandonner l'utilisation de SQLite, j'ai utilisé avec succès SQLite sur plusieurs sites en direct plus petits et il fonctionne très bien.
la source
J'utilise l'environnement:
Je pense que c'est une bien meilleure approche, car vous aurez éventuellement besoin de paramètres spéciaux pour votre environnement de test, et vous pouvez facilement l'ajouter à cette condition.
la source
C'est un article plus ancien, mais je pense que si j'ajoute cela utile,
library
cela simplifiera les choses.Utilisez django-configuration
Démarrage rapide
Ensuite, sous-classez la classe configurations.Configuration incluse dans le fichier settings.py de votre projet ou dans tout autre module que vous utilisez pour stocker les constantes de paramètres, par exemple:
Définissez la
DJANGO_CONFIGURATION
variable d'environnement sur le nom de la classe que vous venez de créer, par exemple dans~/.bashrc
:export DJANGO_CONFIGURATION=Dev
et la
DJANGO_SETTINGS_MODULE
variable d'environnement vers le chemin d'importation du module comme d'habitude, par exemple dans bash:export DJANGO_SETTINGS_MODULE=mysite.settings
Vous pouvez également fournir l'
--configuration
option lors de l'utilisation des commandes de gestion Django le long des lignes de l'--settings
option de ligne de commande par défaut de Django, par exemple:python manage.py runserver --settings=mysite.settings --configuration=Dev
Pour permettre à Django d'utiliser votre configuration, vous devez maintenant modifier votre script manage.py ou wsgi.py pour utiliser les versions de django-configurations des fonctions de démarrage appropriées, par exemple un manage.py typique utilisant django-configurations ressemblerait à ceci:
Remarquez à la ligne 10 que nous n'utilisons pas l'outil commun
django.core.management.execute_from_command_line
mais à la placeconfigurations.management.execute_from_command_line
.La même chose s'applique à votre fichier wsgi.py , par exemple:
Ici, nous n'utilisons pas la
django.core.wsgi.get_wsgi_application
fonction par défaut mais à la placeconfigurations.wsgi.get_wsgi_application
.C'est tout! Vous pouvez maintenant utiliser votre projet avec manage.py et votre serveur compatible WSGI préféré.
la source
En fait, vous devriez probablement envisager d'avoir les mêmes (ou presque les mêmes) configurations pour votre environnement de développement et de production. Sinon, des situations comme "Hé, ça marche sur ma machine" se produiront de temps en temps.
Donc, pour automatiser votre déploiement et éliminer ces problèmes WOMM, utilisez simplement Docker .
la source