由于工作需要,需要将数据库的int型数据转换成string类型放到页面上,并从页面上拿回string类型转换成可以作为sql查询参数的int型数据。注,这个string类型的字串和int型数据纯属于人工自定义的编码行为,因此需要用到config文件。
查到python有ConfigParser,这个还蛮好用的,赶紧试了一下:
1.设计config文件:config.cfg,文件分为很多个section,每个section包含很多对key-value;如下:
[server type]
1= App Server
2= WriteBack Server
3= Memcache Server
4= Database Server
[server status]
0= added
1= monitored
2= crashed
3= deleted
4= alerted
[alert type]
1= email alert
2= sms alert
[server monitor status]
0= Alert
1= Don't Alert
2.读取配置文件:
def readConfig(type, value='1'): config = ConfigParser.ConfigParser() #type = "ServerStatus" value = str(value) try: with open("./static/data/config.cfg","r") as cfgfile: config.readfp(cfgfile) if type == "ServerType": items = dict(config.items('server type')) elif type == "ServerStatus": items = dict(config.items('server status')) elif type == "AlertType": items = dict(config.items('alert type')) elif type == "MonitorStatus": items = dict(config.items('server monitor status')) data = items[value] print data return data except Exception: print 'error in readConfig when setting new host string by config file'
在每次从数据库取到数据时,调用这个readConfig方法将拿到的数据进行config成string,再传到页面进行显示。结果很顺利!
但是问题也随之来了,我还要从页面上拿回这个String传到后台作为取数据的sql参数,但是这个与数据库毫无关系的string如何转换成int呢?我想了一个dconfig,就是反config回来啦!但是蹊跷的是,同样的方法,却得到了一个int() argument must be a string or a number, not 'NoneType'的错误,于是查找定位到我在初始化value这个参数的时候传了一个空串,然后被当做None,int(None)是不被接受的。改掉,依旧不行。打印传回来的参数:
alerted
App Server
于是做了个小测试,发现alerted能找到它的对应值,但是App Server找不到,改成小写的’app server‘结果又找到了,真是坑爹,去看下文档有没有说明不接受大写字符串,或者是有存在编码问题?
最后将config的文件里全改成小写,做测试,好莫名其妙啊!打印出来竟然还是:
alerted
App Server
Why??明明文件已经保存了!难道这cfg文件是要缓存到客户端里的?不可能,明明是后台调用的,好吧,我把你删掉再建一个,放进去小写,重启动。ok了!这次变小些了,只是页面上显示的还是小写的,未必符合要求。
ConfigParser是个好东西,python的库就是封装的好啊!关于config的事情,如果没有特殊要求,基本上够用啦。。。。
忽然想到一个事情,我这典型的交互和需要config的次数太多,我为啥不考虑把config的一个key-value都传到客户端嗯?再客户端显示的时候用string的value,返回查询用的int的key,岂不是一举两得?