写之前随便百度了一下博客,又看到廖雪峰的博客了。果然置顶的能力很强。
我想说其实property的用法并不是主要用来做类型检查。反而更多应该是用于简化操作的目的。
写之前想聊一个古老的话题。年初的时候刚接触flask。当时用SQLAlchemy的Model模型去构建了一张表。在刚入门的时候,觉得仅仅是不用写SQL这么一回事
现在看来,其实SQLAlchemy的用法隐含的思想是将一个表抽象为一个对象,或者一个实体。对于实体的内容进行解读。数据库只是作为存放内容的工具而已。
初学的时候,后端要返回数据给前端。按照上面的认知,先用dbname.query.all()查出表中的所有数据。
然后就开始傻傻的写for循环。比如查出来的数据要转成字典。会在循环前定义一个空字典。每次循环用i计数器的值作为字典键值啊这种傻傻的用法。
不过不管怎么说,从功能上面来看,还是完整完成了要求。不得不说是一份不精致的答案。甚至当初因为这种思想,一直搞不清楚json值的正确用法。那是因为自己去实现了从数据到json的转换。所以不优雅,不高效。
混着混着,时间就过去了这么几个月。有些事情就是在没有思考的情况下突然想明白的。不知道是个人风格或是其他。总之现在在用这个的时候就很明确为什么要这么干而不是选择其他方法。
可能更加理解python的目的性了吧:简洁胜于高效
高不高效的事情我还没到可以讨论的阶段。上次看dict类型的实现就明白了。并没有那么多可以研习人家造出来轮子的原理的时间。先用,哪天自然就懂了
接下来简单写一下代码。
基础代码是这样:
1 # SQLAlchemy Model 2 class Tools(db.Model): 3 id = db.Column(db.String(100), primary_key=True) 4 toolname = db.Column(db.String(100)) 5 tooldir = db.Column(db.String(100)) 6 toolurl = db.Column(db.String(100)) 7 tooltext = db.Column(db.String(100)) 8 9 10 # Tool.json(demo) 11 [ 12 {"toolId":1,"toolName":"工具1","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"}, 13 {"toolId":2,"toolName":"工具2","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"}, 14 {"toolId":3,"toolName":"工具3","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"}, 15 {"toolId":4,"toolName":"工具4","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"}, 16 {"toolId":5,"toolName":"工具5","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"}, 17 {"toolId":6,"toolName":"工具6","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"} 18 ] 19 20 21 # Flask route restful api 22 @ns.route('/store') 23 class Store(Resource): 24 def get(self): 25 tools = Tools.query.all() 26 # do something to change variable name then return 27 return jsonify(tools)
简单介绍一下上面代码的内容。
1-7行:表的模型类
11-18行:前端给出的json文件(接口字段)
21-27行:后端接口实现(注释部分代表省略了数据处理的代码)
由于后端接口自己去写一个转换的代码,按照以前那种写法会很长。不贴出来了。自己去优化一个更无聊。(码代码久了,更喜欢偷懒了)
所以接下来贴使用property来实现的接口处理
1 # SQLAlchemy Model 2 class Tools(db.Model): 3 id = db.Column(db.String(100), primary_key=True) 4 toolname = db.Column(db.String(100)) 5 tooldir = db.Column(db.String(100)) 6 toolurl = db.Column(db.String(100)) 7 tooltext = db.Column(db.String(100)) 8 9 @property 10 def serialize(self): 11 series = { 12 'toolId': self.id, 13 'toolName': self.toolname, 14 'tooldir': self.tooldir, 15 'toolUrl': self.toolurl, 16 'toolText': self.tooltext 17 } 18 return series 19 20 21 # Tool.json(demo) 22 [ 23 {"toolId":1,"toolName":"工具1","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"}, 24 {"toolId":2,"toolName":"工具2","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"}, 25 {"toolId":3,"toolName":"工具3","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"}, 26 {"toolId":4,"toolName":"工具4","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"}, 27 {"toolId":5,"toolName":"工具5","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"}, 28 {"toolId":6,"toolName":"工具6","toolDir":"demo.png","toolUrl":"../src/file/file1.txt","toolText":"工具说明"} 29 ] 30 31 32 # Flask route restful api 33 @ns.route('/store') 34 class Store(Resource): 35 def get(self): 36 return jsonify([i.serialize for i in Tools.query.all()])
感觉清晰明了很多。
顺便在实现这个的过程中,也算清楚了python自带的json包的方法和flask的jsonify方法的区别是什么。
不得不说,jsonify真是偷懒的好方法。
ps:吐槽一下这狗屎代码插入器。显示在博客当中的时候会因为dom结构宽度不够直接把代码撑到行号中间去。wtf。只能删减掉一些内容了