django中如何如何针对不同的环境使用多个配置文件?

yzhengwei
  • 170

在flask中时配置文件可以专门写成一个文件,文件中针对不同的环境可以写不同的类,启动app时会执行 create_app函数,根据传入的配置类的名字加载相应的配置。但是在django中不知道该如何配置?有没有对djanog熟悉的同学,说下django是如何实现多个settings配置,或者也用类的方法区别不同环境?

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    SQLALCHEMY_TRACK_MODIFICATIONS = False


class DevelopmentConfig(Config):
    basedir = os.path.abspath(os.path.dirname(__file__))
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')
    ADMIN_EMAIL = 'Admin@flask.com'
    ADMIN_USER = 'Admin'
    ADMIN_PASSWD = 'Admin'


class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = 'mysql://yang:yang@www.opstr.club:3306/Test'


config = {
    'development': DevelopmentConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig
}
def create_app(config_name='default'):
    app = Flask(__name__)
    app.config.from_object(config[config_name])

    db.init_app(app)
    login_manager.init_app(app)
回复
阅读 5.7k
4 个回答

你可以在调用manage.py的时候指定--settings,然后可以把本来的settings.py分为多个文件,比如dev.py/test.py等等

有啊 需要自己写,你要知道启动的入口在manage.py,写个方法判断传入的参数,再去加载不同的配置文件,比如给你看个例子https://github.com/edx/edx-pl...

李琳
  • 2
新手上路,请多包涵

这个问题两年了,都没人回答啊。。我来答吧。
1、上面这个config.py文件放在和manange.py同级的目录下
2、修改manage.py来引入这个配置文件里面的类
3、修改下手动加载的参数,因为django的调试模式,导致会被运行两遍,这样程序以为参数多了,会报错。

下面是代码

#config.py
import os 
 
class Config(object):    
    """Base config class."""
 
    HOST='0.0.0.0'
    PORT='8000'
 
    pass
 
class ProdConfig(Config):
    """Production config class."""
    pass
 
class DevConfig(Config):
    """Development config class."""
    # Open the DEBUG
    DEBUG = True

manage.py里面需要增加两行,就保持3个参数,多被增加的参数直接pop掉就好了。
原因是:在开发模式下,通过python manage.py runserver的方式启动django的时候,会启动两个线程去加载settings文件,一个是用来给你服务的,另一个是监控settings文件是否改变的,如果改变就立即让他生效,所以会导致上面的错误

#manage.py   
import config
 
config_dev=config.DevConfig()
str_tmp=config_dev.HOST+':'+config_dev.PORT
sys.argv.append(str_tmp)

if len(sys.argv)>3:
    sys.argv.pop() 

当然这样子弄了半天,其实也就是节省了运行程序从

python manage.py runserver 0.0.0.0:8000
python manage.py runserver

数据库相关配置,估计还是需要写在settings.py里面吧,暂时不知道有什么办法,把数据库也弄出来,那样更负责了,等待有人来简化;)

http://www.lilin.net/

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏