Wie kann ich auf die importierten lokalen Einstellungen ohne Umlaufimport zugreifen?

  • Am Ende meiner Datei settings.py habe ich:

     try:
        from local_settings import *
    except ImportError:
        pass
     

    Ich habe dann eine Datei local_settings.py, in der ich einige Datenbankeinstellungen usw. habe. In dieser Datei möchte ich auch Folgendes tun (um django_debug_toolbar zu verwenden):

     INTERNAL_IPS = ('127.0.0.1',)
    MIDDLEWARE_CLASSES += ('debug_toolbar.middleware.DebugToolbarMiddleware',)
    INSTALLED_APPS += ('debug_toolbar',)
     

    Ich möchte diese Einstellungen hier einfügen, damit sie nicht in der Produktionsumgebung angezeigt werden, in der die Hauptdatei settings.py, aber natürlich diese Datei verwendet wird kann nicht auf die ursprünglichen Einstellungen zugreifen, da sie keine Einstellungen von settings.py kennt. Wie kann ich einen möglicherweise zirkularen Import vermeiden, um das zu erreichen, was ich versuche?

    06 December 2012
    Anthony Mastrean
2 answers
  • Ich verwende einen Ansatz, bei dem meine Einstellungen eigentlich ein Paket sind und kein Modul.

    Einstellungen / init .py base.py local.py #dieses ist auf .gitignore

    init .py:

     from setings import *
    try:
        from local.py import *
    except ImportError:
        pass
     

    base.py:

     import os
    DEBUG = False
    TEMPLATE_DEBUG = DEBUG
    
    SITE_ROOT = os.path.join( os.path.dirname( os.path.realpath(__file__) ) ,'..' )
    
    ADMINS = (
        # ('Your Name', 'your_email@example.com'),
    )
    
    MANAGERS = ADMINS
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
            'NAME': '',                      # Or path to database file if using sqlite3.
            'USER': '',                      # Not used with sqlite3.
            'PASSWORD': '',                  # Not used with sqlite3.
            'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
            'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
        }
        }
    
    etc...
     

    local.py:

     from settings import settings as PROJECT_DEFAULT
    
    PREPEND_WWW = False
    DEBUG = True
    TEMPLATE_DEBUG = DEBUG
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_pyscopg2', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
            'NAME': 'somesecretname',                      # Or path to database file if using sqlite3.
            'USER': 'somesecretuser',                      # Not used with sqlite3.
            'PASSWORD': 'somesecretpassword',                  # Not used with sqlite3.
            'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
            'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
        }
    }
    
    INSTALLED_APPS += PROJECT_DEFAULT.INSTALLED_APPS + ('debug_toolbar',)
     

    Ein Beispiel dafür finden Sie in hier

    22 November 2011
    armonge
  • Das können Sie nicht tun. Das importierte Modul wird in seinem eigenen Bereich ausgeführt und kann nicht wissen, wo (und ob) es auf irgendeine Weise importiert wurde. Eine Alternative wäre etwa so:

    In Ihren local_settings:

     INTERNAL_IPS = ('127.0.0.1',)
    MIDDLEWARE_CLASSES = ('debug_toolbar.middleware.DebugToolbarMiddleware',)
    INSTALLED_APPS = ('debug_toolbar',)
     

    Und in den Haupteinstellungen.py

     try:
        import local_settings as local
        has_local = True
    except ImportError:
        has_local = False
    
    # ...
    if has_local:
        MIDDLEWARE_CLASSES += local.MIDDLEWARE_CLASSES
     
    22 November 2011
    Martin Thuraudtcuk