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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。