Python3教程Web开发实战梳理-day6(配置文件)

Day6:编写配置文件

有了Web框架和ORM框架,我们就可以开始装配App了。

通常,一个Web App在运行时都需要读取配置文件,比如数据库的用户名、口令等,在不同的环境中运行时,Web App可以通过读取不同的配置文件来获得正确的配置。

由于Python本身语法简单,完全可以直接用Python源代码来实现配置.

默认的配置文件应该完全符合本地开发环境,这样,无需任何设置,就可以立刻启动服务器。

创建默认的配置文件命名为config_default.py:

# config_default.py

configs = {
    'db': {
        'host': '127.0.0.1',
        'port': 3306,
        'user': 'your user name',
        'password': 'your password',
        'database': 'awesome'
    },
    'session': {
        'secret': 'AwEsOmE'
    }
}

上述配置文件简单明了。但是,如果要部署到服务器时,通常需要修改数据库的host等信息,直接修改config_default.py不是一个好办法,更好的方法是编写一个config_override.py,用来覆盖某些默认设置:

# config_override.py

configs = {
    'db': {
        'host': '192.168.0.100'
    }
}

把config_default.py作为开发环境的标准配置,把config_override.py作为生产环境的标准配置,我们就可以既方便地在本地开发,又可以随时把应用部署到服务器上。

应用程序读取配置文件需要优先从config_override.py读取。为了简化读取配置文件,可以把所有配置读取到统一的config.py中:

# config.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''
Configuration
'''

import config_default

class Dict(dict):
    '''
    Simple dict but support access as x.y style.
    '''
    def __init__(self, names=(), values=(), **kw):
        super(Dict, self).__init__(**kw)
        for k, v in zip(names, values):
            self[k] = v

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"'Dict' object has no attribute '%s'" % key)

    def __setattr__(self, key, value):
        self[key] = value
#将default和override中的配置合并,最终以override为准
def merge(defaults, override):#收集参数
    r = {}
    for k, v in defaults.items():
        if k in override:# 如果覆盖文件有此参数
            if isinstance(v, dict):# 判断是否其value为dict
                r[k] = merge(v, override[k]) # 是的话,则创建新的字典后,调用原函数(递归)
            else:
                r[k] = override[k] # 否则把覆盖配置文件的值导入
        else:
            r[k] = v # 如果覆盖文件没有,就继续使用默认值
    return r

def toDict(d):
    D = Dict()
    for k, v in d.items():
        D[k] = toDict(v) if isinstance(v, dict) else v
    return D

configs = config_default.configs

try:
    import config_override
    configs = merge(configs, config_override.configs)
except ImportError:
    pass

configs = toDict(configs)

这样,我们就完成了App的配置。
在本地开发时,实际上只需要一个config_default就足够了,之所以按照教程这种方式实现,是为了写出便于后期维护的代码,养成好习惯,所以不要怕麻烦呀。

猜你喜欢

转载自blog.csdn.net/josephpai/article/details/76036991