我有一个应用程序,它有多个用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配置应用程序的其余部分?
答案 0 :(得分:0)
为了详细说明我的评论,我通常会创建一个基本配置类,然后扩展该基类以创建每个环境所需的配置。然后,我使用静态方法创建一个工厂类,该方法为我实例化适当的配置类。
以下是一个例子。请注意,我将IS_DEV
和IS_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