Python-ic分离settings.py PROD和DEBUG常量的方法?

时间:2015-10-11 03:31:09

标签: python config

我有一个应用程序,它有多个用python编写的组件(Redis缓存,MariaDB,烧瓶API等)。我正在创建一个settings.py文件,以便在一个地方获取所有常量(REDIS_URL,REDIS_IP,REDIS_PORT ...... 等。)。我目前设置的方式是......

run/run_app_debug.py
  settings.init_debug()
  # now settings will return the "debug" constants

run/run_app_prod.py
  # no change to settings

lib/update_cache.py
  # how settings get used...
  redis_server = redis.Redis(host=settings.REDIS_IP, port=settings.REDIS_PORT)

settings.py
  REDIS_IP = '1.2.3.4'
  REDIS_PORT = 6379
  REDIS_URL = 'redis://{}:{}'.format(REDIS_IP, REDIS_PORT)
  # ...
  def init_debug():
    REDIS_IP = '127.0.0.1'
    # ...

是否有更多的python-ic方式来做这个,或者有关如何最好地重构这个“settings.py”文件的任何建议,或者其他一些更优雅的方式来拥有一个可以向其传播重要常量的中央python配置应用程序的其余部分?

1 个答案:

答案 0 :(得分:0)

为了详细说明我的评论,我通常会创建一个基本配置类,然后扩展该基类以创建每个环境所需的配置。然后,我使用静态方法创建一个工厂类,该方法为我实例化适当的配置类。

以下是一个例子。请注意,我将IS_DEVIS_PROD添加到相应的配置类中,以便在我访问配置实例时可以告诉我的应用程序在哪里运行。

### inside some config.py file
### ...

__all__ = ['ConfigFactory']

class ConfigFactory(object):
    """
    Factory class for generating the proper configuration
    based on the environment in which we are running
    """

    @staticmethod
    def get_config():
        if os.getenv('PRODUCTION_VARIABLE') is not None:
            return _ProductionConfig()
        return _DevelopmentConfig()


class _BaseConfig(object):

    DEBUG = False
    IMPORTANT_VAR = False
    SPECIAL_VAR = os.getenv('SPECIAL_VAR', 'NOTSET')

class _DevelopmentConfig(_BaseConfig):

    DEBUG = True
    IS_DEV = True

class _ProductionConfig(_BaseConfig):

    IMPORTANT_VAR = True
    IS_PROD = True