寫之前隨便百度了一下博客,又看到廖雪峰的博客了。果然置頂的能力很強。
我想說其實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。只能刪減掉一些內容了
