web-dev-qa-db-fra.com

Comment configurez-vous Django pour un développement et un déploiement simples?

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é?

109
reppimp

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 .

84
Jim

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.

25
Gabriel Ross

À 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.

22
Dmitry Shevchenko

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.

11
John Millikin

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': {
           ....
    }
}
7
Andre Bossard

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).

2
Josue

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.  

1
Chase Seibert

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
1
sacabuche

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.

1
Sean O Donnell

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.

0
Ycros

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.

0
slashmili

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
0
JM Desrosiers