flask框架json数据的拿取和返回操作示例
本文实例讲述了flask框架json数据的拿取和返回操作。分享给大家供大家参考,具体如下:
json数据结构:以套票票网站的城市数据为例,拿到数据莫慌,
1先分析数据结构,有几个大的字段(‘returnCode'和‘retuenValue'字段,只有一个字段作为定义,另一个字段作为保留(无需处理)
2键表---->拆分'returnValue‘确定数据库表结构,('A‘[]城市首字母表和 城市具体信息字段{}表)
3将拿到的数据拆分插入到数据库中
4将数据库的数据以JSON的形式返回给用户
(a)拿到的数据:
} "returnCode":"0", "returnValue":{ "A":[ { "id":3643, "parentId":0, "regionName":"阿坝", "cityCode":513200, "pinYin":"ABA" }, { "id":3090, "parentId":0, "regionName":"阿克苏", "cityCode":652901, "pinYin":"AKESU" }, { "id":3632, "parentId":0, "regionName":"阿拉善", "cityCode":152900, "pinYin":"ALASHAN" }, { "id":899, "parentId":0, "regionName":"安康", "cityCode":610900, "pinYin":"ANKANG" }, { "id":196, "parentId":0, "regionName":"安庆", "cityCode":340800, "pinYin":"ANQING" }, { "id":758, "parentId":0, "regionName":"鞍山", "cityCode":210300, "pinYin":"ANSHAN" }, { "id":388, "parentId":0, "regionName":"安顺", "cityCode":520400, "pinYin":"ANSHUN" }, { "id":454, "parentId":0, "regionName":"安阳", "cityCode":410500, "pinYin":"ANYANG" } ],
B....C....D....Z省略其他大写字母开头的城市,以A开头的城市名为例
(b)表结构,建立外键models.py
fromApp.extimportdb #定义城市名大写字母类,在数据的最外层 classLetter(db.Model): id=db.Column(db.Integer,primary_key=True,autoincrement=True) letter=db.Column(db.String(8),unique=True,nullable=False) #定义城市类,嵌套层 classCity(db.Model): id=db.Column(db.Integer,primary_key=True,autoincrement=True) parentId=db.Column(db.Integer,nullable=False,defaut=0) regionName=db.Column(db.String(30),nullable=False) cityCode=db.Column(db.Integer) pinYin=db.Column(db.String(128)) #建立外键‘首字母' first_letter=db.Column(db.String(8),db.ForeignKey(Letter.letter))
(c)addcities.py插入数据:
fromflask_restful.representationsimportjson fromsqlalchemy.dialects.mysqlimportpymysql defadd_cities(): #链接数据库 db=pymysql.Connect(host='10.0.118.135',user='root',password='xxxxxxx',database='tpp6666',port=3306) cursor=db.cursor() #读取拿到的数据,遍历数据 withopen('citylist.json')ascl: returnValue=json.load(cl).get('returnValue') forkeyinreturnValue: forcityinreturnValue.get(key): db.begin() #插入数据,以每一个大写字母为一个字段插入,以字典的形式 cursor.execute( 'insertintocity(id,parentId,regionName,cityCode,pinYin,first_letter)values({},{},"{}",{},"{}","{}");'.format( city['id'],city['parentId'],city['regionName'],city['cityCode'],city['pinYin'],key)) db.commit() if__name__=='__main__': add_cities()
(d)CityAPI.py读取数据并以JSON的形式返回:
fromflask_restfulimportResource,fields,marshal_with fromApp.modelsimportLetter,City #字段的格式化: city_fields={ 'id':fields.Integer, '父编号':fields.Integer(attribute='parentId'),#起别名attribute '名称':fields.String(attribute='regionName'), '拼音':fields.String(attribute='pinYin'), '城市编码':fields.Integer(attribute='cityCode'), '首字母':fields.String(attribute='first_letter') } value_fields={ 'A':fields.List(fields.Nested(city_fields)), 'B':fields.List(fields.Nested(city_fields)), 'C':fields.List(fields.Nested(city_fields)), 'D':fields.List(fields.Nested(city_fields)), 'E':fields.List(fields.Nested(city_fields)), 'F':fields.List(fields.Nested(city_fields)), 'G':fields.List(fields.Nested(city_fields)), 'H':fields.List(fields.Nested(city_fields)), 'J':fields.List(fields.Nested(city_fields)), 'K':fields.List(fields.Nested(city_fields)), 'L':fields.List(fields.Nested(city_fields)), 'M':fields.List(fields.Nested(city_fields)), 'N':fields.List(fields.Nested(city_fields)), 'P':fields.List(fields.Nested(city_fields)), 'Q':fields.List(fields.Nested(city_fields)), 'R':fields.List(fields.Nested(city_fields)), 'S':fields.List(fields.Nested(city_fields)), 'T':fields.List(fields.Nested(city_fields)), 'W':fields.List(fields.Nested(city_fields)), 'X':fields.List(fields.Nested(city_fields)), 'Y':fields.List(fields.Nested(city_fields)), 'Z':fields.List(fields.Nested(city_fields)), } result_fields={ 'returnCode':fields.Integer, 'returnValue':fields.Nested(value_fields) } #整体逻辑定义都在这里: @marshal_with是flask内置的Json序列化的方法,
在Django里json序列化是json.dumps()
classCityResrouce(Resource): @marshal_with(result_fields) defget(self): #定义外层字段为空字典{},存放数据 returnValue={} #拿到所有的首字母 letters=Letter.query.all() forletterinletters: #根据首字母拿到每个首字母对应的所有城市 #filter拿到的结果是一个BaseQuery对象。 #如果直接答应BaseQuery对象,它会输出SQL语句 #如果想要打印BaseQuery里的所有数据,调用all()方法可以拿到BaseQuery里的所有数据 cities=City.query.filter(City.first_letter==letter.letter) #dict={letter.letter:cities} #print(dict) returnValue[letter.letter]=cities.all() return{'returnCode':0,'returnValue':returnValue}
(d)api__init__.py:
fromflask_restfulimportApi fromApp.Apis.CityAPIimportCityResrouce fromApp.Apis.UserAPIimportUerResource api=Api() definit_api(app): api.init_app(app=app) api.add_resource(CityResrouce,'/cities/')
希望本文所述对大家基于flask框架的Python程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。