本文实例讲述了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
from App.ext import db #定义城市名大写字母类,在数据的最外层 class Letter(db.Model): id = db.Column(db.Integer,primary_key =True,autoincrement=True) letter = db.Column(db.String(8),unique=True,nullable=False) #定义城市类,嵌套层 class City(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插入数据:
from flask_restful.representations import json from sqlalchemy.dialects.mysql import pymysql def add_cities(): #链接数据库 db = pymysql.Connect(host= '10.0.118.135',user = 'root',password ='xxxxxxx',database = 'tpp6666',port = 3306) cursor = db.cursor() #读取拿到的数据,遍历数据 with open('citylist.json')as cl: returnValue = json.load(cl).get('returnValue') for key in returnValue: for city in returnValue.get(key): db.begin() #插入数据,以每一个大写字母为一个字段插入,以字典的形式 cursor.execute( 'insert into city(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的形式返回 :
from flask_restful import Resource, fields, marshal_with from App.models import Letter, 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()
class CityResrouce(Resource): @marshal_with(result_fields) def get(self): #定义外层字段为空字典{},存放数据 returnValue = {} # 拿到所有的首字母 letters = Letter.query.all() for letter in letters: # 根据首字母拿到每个首字母对应的所有城市 # 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:
from flask_restful import Api from App.Apis.CityAPI import CityResrouce from App.Apis.UserAPI import UerResource api = Api() def init_api(app): api.init_app(app=app) api.add_resource(CityResrouce, '/cities/')
希望本文所述对大家基于flask框架的Python程序设计有所帮助。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。