187 votes

Django : Comment gérer les paramètres de développement et de production ?

J'ai développé une application de base. Maintenant, au stade du déploiement, il est devenu clair que j'ai besoin de paramètres locaux et de paramètres de production.

Il serait bon de connaître les éléments suivants :

  • Comment gérer au mieux les paramètres de développement et de production.
  • Comment garder des applications telles que django-debug-toolbar uniquement dans un environnement de développement.
  • Tout autre conseil et meilleure pratique pour les paramètres de développement et de déploiement.

1 votes

150voto

Thomas Orozco Points 15280

En DJANGO_SETTINGS_MODULE variable d'environnement contrôle le fichier de paramètres que Django chargera.

Vous devez donc créer des fichiers de configuration distincts pour vos environnements respectifs (notez qu'ils peuvent bien sûr être tous les deux import * à partir d'un fichier séparé de "paramètres partagés"), et utilisez DJANGO_SETTINGS_MODULE pour contrôler lequel utiliser.

Voici comment :

Comme indiqué dans la documentation de Django :

La valeur de DJANGO_SETTINGS_MODULE doit être en syntaxe de chemin Python, par exemple mysite.settings. Notez que le module settings doit se trouver sur le chemin de recherche des importations Python.

Donc, supposons que vous avez créé myapp/production_settings.py y myapp/test_settings.py dans votre dépôt de sources.

Dans ce cas, vous devez respectivement définir DJANGO_SETTINGS_MODULE=myapp.production_settings pour utiliser le premier et DJANGO_SETTINGS_MODULE=myapp.test_settings d'utiliser ce dernier.


À partir de là, le problème se résume à régler le paramètre DJANGO_SETTINGS_MODULE variable d'environnement.

Réglage de DJANGO_SETTINGS_MODULE en utilisant un script ou un shell

Vous pouvez ensuite utiliser un script d'amorçage ou un gestionnaire de processus pour charger les paramètres corrects (en définissant l'environnement), ou simplement l'exécuter depuis votre shell avant de démarrer Django : export DJANGO_SETTINGS_MODULE=myapp.production_settings .

Notez que vous pouvez exécuter cette exportation à tout moment à partir d'un shell - elle n'a pas besoin de vivre dans votre .bashrc ou quoi que ce soit.

Réglage de DJANGO_SETTINGS_MODULE en utilisant un gestionnaire de processus

Si vous n'aimez pas écrire un script de démarrage qui définit l'environnement (et il y a de très bonnes raisons de penser ainsi !), je recommanderais d'utiliser un gestionnaire de processus :


Enfin, notez que vous peut profiter de la PYTHONPATH pour stocker les paramètres à un endroit complètement différent (par exemple, sur un serveur de production, en les stockant dans le fichier /etc/ ). Cela permet de séparer la configuration des fichiers d'application. Vous pouvez ou non vouloir cela, cela dépend de la façon dont votre application est structurée.

107voto

cs01 Points 2100

Par défaut, utilisez les paramètres de production, mais créez un fichier appelé settings_dev.py dans le même dossier que votre settings.py dossier. Ajoutez-y des surcharges, telles que DEBUG=True .

Sur l'ordinateur qui sera utilisé pour le développement, ajoutez ce qui suit à votre fichier ~/.bashrc fichier :

export DJANGO_DEVELOPMENT=true

Au bas de votre settings.py ajoutez ce qui suit.

# Override production variables if DJANGO_DEVELOPMENT env variable is set
if os.environ.get('DJANGO_DEVELOPMENT'):
    from settings_dev import *  # or specific overrides

(Notez que l'importation * doivent généralement être évitées en Python)

Par défaut, les serveurs de production ne remplacent rien. C'est fait !

Par rapport aux autres réponses, celle-ci est plus simple car elle ne nécessite pas de mise à jour. PYTHONPATH ou le réglage DJANGO_SETTINGS_MODULE qui ne vous permet de travailler que sur un seul projet django à la fois.

45voto

Ahtisham Points 2628

Voici comment je fais en 6 étapes faciles :

  1. Créez un dossier dans le répertoire de votre projet et nommez-le settings .

    Structure du projet :

    myproject/
           myapp1/
           myapp2/              
           myproject/
                  settings/
  2. Créez quatre fichiers python à l'intérieur du settings répertoire à savoir __init__.py , base.py , dev.py y prod.py

    Fichiers de paramètres :

    settings/
         __init__.py
         base.py
         prod.py
         dev.py 
  3. Ouvrir __init__.py et le remplir avec le contenu suivant :

    init .py :

    from .base import *
    # you need to set "myproject = 'prod'" as an environment variable
    # in your OS (on which your website is hosted)
    if os.environ['myproject'] == 'prod':
       from .prod import *
    else:
       from .dev import *
  4. Ouvrir base.py et le remplir avec tous les paramètres communs (qui seront utilisés aussi bien en production qu'en développement.) par exemple :

    base.py :

    import os
    ...
    INSTALLED_APPS = [...]
    MIDDLEWARE = [...]
    TEMPLATES = [{...}]
    ...
    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
    MEDIA_ROOT = os.path.join(BASE_DIR, '/path/')
    MEDIA_URL = '/path/'
  5. Ouvrir dev.py et inclure les éléments qui sont spécifiques au développement, par exemple :

    dev.py :

    DEBUG = True
    ALLOWED_HOSTS = ['localhost']
    ...
  6. Ouvrir prod.py et inclure les éléments qui sont spécifiques à la production, par exemple :

    prod.py :

    DEBUG = False
    ALLOWED_HOSTS = ['www.example.com']
    LOGGING = [...]
    ...

Mise à jour

Comme l'a suggéré ANDRESMA dans les commentaires. Mise à jour BASE_DIR dans votre base.py pour refléter votre chemin mis à jour en ajoutant un autre .parent jusqu'à la fin. Par exemple :

BASE_DIR = Path(__file__).resolve().parent.parent.parent

38voto

Daniel Watkins Points 697

J'ai généralement un fichier de paramètres par environnement, et un fichier de paramètres partagé :

/myproject/
  settings.production.py
  settings.development.py
  shared_settings.py

Chacun de mes fichiers d'environnement a :

try:
    from shared_settings import *
except ImportError:
    pass

Cela me permet de remplacer les paramètres partagés si nécessaire (en ajoutant les modifications sous cette stanza).

Je sélectionne ensuite les fichiers de paramètres à utiliser en les liant à settings.py :

ln -s settings.development.py settings.py

4 votes

Comment gérez-vous l'interdiction de pep8 de import * ? Désactivez-vous cette vérification ? J'ai enveloppé cette importation dans un exec() mais alors je ne peux pas avoir de conditionnelles sur des variables qui ne sont pas définies dans ce fichier, et je ne peux pas non plus modifier INSTALLED_APPS parce qu'elle est "indéfinie".

16 votes

Nous ne lintons pas nos fichiers de configuration, car il ne s'agit pas vraiment de code mais plutôt de configuration exprimée en Python.

13voto

J'utilise le génial django-configurations et tous les paramètres sont stockés dans mon settings.py :

from configurations import Configuration

class Base(Configuration):
    # all the base settings here...
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    ...

class Develop(Base):
    # development settings here...
    DEBUG = True 
    ...

class Production(Base):
    # production settings here...
    DEBUG = False

Pour configurer le projet Django, j'ai simplement suivi les instructions suivantes docs .

0 votes

En outre, vous pouvez ajouter des références aux fichiers dotenv afin de les inclure dans une classe, par exemple, DOTENV = os.path.join(BASE_DIR, ".env") qui prendra le nom de la classe comme nom de fichier env.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X