J'ai tendance à utiliser SQLite quand je fais Django Développement, mais sur un serveur live, quelque chose de plus robuste est Souvent nécessaire ( MySQL / PostgreSQL , par exemple ) . Invariablement, il y a d'autres modifications à apporter aux paramètres de Django : Différents emplacements/intensités de journalisation, Chemins d'accès aux supports, etc.
Comment gérez-vous toutes ces modifications pour que le déploiement soit un processus simple, automatisé?
Update: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 exemple. DEBUG = True
.settings_production.py
- configuration utilisée pour la production, par exemple. SERVER_EMAIL
.Je les lie tous ensemble avec un fichier settings.py
qui importe d'abord settings_local.py
, puis l'un des deux autres. Il décide lequel charger par deux paramètres dans settings_local.py
- DEVELOPMENT_HOSTS
et PRODUCTION_HOSTS
. settings.py
appelle platform.node()
pour rechercher le nom d'hôte de la machine sur laquelle il est exécuté, puis recherche ce nom 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.
Ainsi, la seule chose dont vous devez vraiment vous soucier est de garder le fichier settings_local.py
à jour avec la configuration spécifique à l'hôte, et tout le reste est traité automatiquement.
Découvrez un exemple ici .
Personnellement, j’utilise un seul fichier settings.py pour le projet, je l’ai juste pour rechercher le nom d’hôte sur lequel il est allumé (mes machines de développement ont des noms d’hôte qui commencent par "gabriel" et j’ai juste ceci:
import socket
if socket.gethostname().startswith('gabriel'):
LIVEHOST = False
else:
LIVEHOST = True
puis dans d'autres parties j'ai des choses comme:
if LIVEHOST:
DEBUG = False
PREPEND_WWW = True
MEDIA_URL = 'http://static1.grsites.com/'
else:
DEBUG = True
PREPEND_WWW = False
MEDIA_URL = 'http://localhost:8000/static/'
etc. Un peu moins lisible, mais cela fonctionne bien et évite de jongler avec plusieurs fichiers de paramètres.
À la fin de settings.py, j'ai les éléments suivants:
try:
from settings_local import *
except ImportError:
pass
Ainsi, si je veux remplacer les paramètres par défaut, je dois simplement mettre settings_local.py juste à côté de settings.py.
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 source. Chaque déploiement a un settings.py
séparé, qui exécute from settings_base import *
au début puis le remplace selon les besoins.
La façon la plus simpliste que j'ai trouvée était:
1) utilisez la valeur par défaut settings.py pour le développement local et 2) Créez un production-settings.py en commençant par:
import os
from settings import *
Et ensuite, remplacez simplement les paramètres qui diffèrent en production:
DEBUG = False
TEMPLATE_DEBUG = DEBUG
DATABASES = {
'default': {
....
}
}
De manière quelque peu liée, pour le problème du déploiement de Django lui-même avec plusieurs bases de données, vous pouvez jeter un oeil sur Djangostack . Vous pouvez télécharger un programme d'installation entièrement gratuit vous permettant 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 programmes d'installation lorsque nous automatisons des déploiements en interne (ils peuvent être exécutés en mode sans assistance).
J'ai mon fichier settings.py dans un répertoire externe. De cette façon, il n'est ni vérifié dans le contrôle de source, ni écrasé par un déploiement. Je mets cela dans le fichier settings.py sous mon projet Django, avec tous les paramètres par défaut:
import sys
import os.path
def _load_settings(path):
print "Loading configuration from %s" % (path)
if os.path.exists(path):
settings = {}
# execfile can't modify globals directly, so we will load them manually
execfile(path, globals(), settings)
for setting in settings:
globals()[setting] = settings[setting]
_load_settings("/usr/local/conf/local_settings.py")
Remarque: Ceci est très dangereux si vous ne pouvez pas faire confiance à local_settings.py.
Eh bien, j'utilise cette configuration:
À la fin de settings.py:
#settings.py
try:
from locale_settings import *
except ImportError:
pass
Et dans locale_settings.py:
#locale_settings.py
class Settings(object):
def __init__(self):
import settings
self.settings = settings
def __getattr__(self, name):
return getattr(self.settings, name)
settings = Settings()
INSTALLED_APPS = settings.INSTALLED_APPS + (
'gunicorn',)
# Delete duplicate settings maybe not needed, but I prefer to do it.
del settings
del Settings
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 de BASE_DIR
et BASE_URL
définis sur le chemin du code et l'URL de la base du site. sont modifiés pour s’ajouter à ceux-ci.
BASE_DIR = "/home/sean/myapp/"
p. ex. MEDIA_ROOT = "%smedia/" % BASEDIR
Ainsi, lors du déplacement du projet, je n'ai qu'à modifier ces paramètres et ne pas rechercher dans l'ensemble du fichier.
Je vous 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.
Je pense que cela dépend de la taille du site pour savoir si vous avez besoin d'utiliser SQLite. J'ai utilisé SQLite avec succès sur plusieurs sites en direct plus petits et il fonctionne très bien.
J'utilise l'environnement:
if os.environ.get('WEB_MODE', None) == 'production' :
from settings_production import *
else :
from settings_dev import *
Je pense que cette approche est bien meilleure, car vous devez éventuellement définir des paramètres spéciaux pour votre environnement de test, et vous pouvez facilement l'ajouter à cette condition.
Tant de réponses compliquées!
Chaque fichier settings.py est livré avec:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
J'utilise ce répertoire pour définir la variable DEBUG comme ceci (reaplace avec le répertoire où votre code de développement est):
DEBUG=False
if(BASE_DIR=="/path/to/my/dev/dir"):
DEBUG = True
Ensuite, chaque fois que le fichier settings.py est déplacé, DEBUG est défini sur False et correspond à 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:
if(DEBUG):
#Debug setting
else:
#Release setting