写在前面:学习之作,诸多不足,共同进步。
最近工作涉及到算法的部署上线,
一个项目中,往往会有一些常量定义,比如主机ip,数据库连接,全局变量这种基础的需求。
所谓常量,就是一旦设定,基本上不再进行改动,或者很少进行改动。
常规来讲,都是字母大写,如果有分割的话,会用下划线进行分割。
比如我之前在JAVA中
class Config{
USER_NUMBER = 6
IP_ADDRESS = 192.168.122.4
}
在python中没有(我简直不敢相信我的眼睛.jpg).
查了下相关资料,需要自己定义。
很好玩,也很有意思。需要override(重写)2个函数就可以了。
下面是代码:
class Config(object):
class ConstError(TypeError):
pass
class ConstCaseError(ConstError):
pass
def __setattr__(self, name, value):
if name in self.__dict__.keys():
#存在性验证, 如果已经设置过了
raise self.ConstCaseError("Can't change a const variable: '%s'" % name)
# if not name.isupper():
# #语法规范验证, 如果不是大写
# raise self.ConstCaseError("Const variable must be combined with upper letters:'%s'" % name)
self.__dict__[name] = value
def __str__(self):
_str = '<====== Configs information ======>\n'
for name, value in self.__dict__.items():
_str += ' {} \t{}\n'.format(name, value)
return _str
if __name__ == "__main__":
config = Config()
config.NAME="handsome"
config.LOCAL_IP="192.168.172.1"
print(config)
输出结果为
这样在项目中期地方使用的时候直接引用就行了。
-------------------------------------------------------------------------------------------------------------------------------
2022年7月12日
这样设置够用了,但是随之而来产生了一个问题。
随着参数设置越来越多,在部署和测试的时候,修改的东西和不断的修改带来了很多困扰。
优化第二版本。
介绍一下os.environ这个方法。
简单来说,有以下几个功能
os.environ['MONEY'] = "90W"
#如果有赋值,则传递对应赋值,否则使用默认定义
NAMETEST = os.environ.get('NAMETEST','here is father class')
我们直接上代码
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY',"hard to guess string")
MAIL_SERVER = os.environ.get('MAIL_SERVER', 'smtp.googlemail.com')
MAIL_PORT = int(os.environ.get('MAIL_PORT', '587'))
MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS', 'true').lower() in \
['true', 'on', '1']
MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]'
FLASKY_MAIL_SENDER = 'Flasky Admin <flasky@example.com>'
FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
SQLALCHEMY_TRACK_MODIFICATIONS = False
NAMETEST = os.environ.get('NAMETEST','here is father class')
os.environ['MONEY'] = "90W"
@staticmethod
def init_app(app):
pass
class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')
NAMETEST = os.environ.get('NAMETEST','here is dev class')
class TestingConfig(Config):
TESTING = True
SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or \
'sqlite://'
class ProductionConfig(Config):
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'data.sqlite')
config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,
'default': DevelopmentConfig
}
if __name__ == "__main__":
config = config["default"]
print(" The data is {}".format(config.NAMETEST))
基础逻辑:
基础变量设置在config里面,同时继承了好几个子类。
当变量需要改变时,在子类里面重写一下就可以了。
比如我测试环境一个,生产环境一个,开发环境一个。
这样子需要修改的时候,不需要动父类的默认定义,
开发组自己用开发的config,
生产环境用devconfig。
再也不担心几百行代码看得人头疼了。。
到这里为止我觉得够用了。
后续再看看