flaskでは、jsonデータの取り出しと返し

6837 ワード

jsonデータ構造:チケットサイトの都市データを例にとると、データを手に入れて慌てないでください.
1まずデータ構造を解析します.いくつかの大きなフィールド('returnCode'と'retuenValue'フィールドは、定義として1つのフィールドのみ、保存として別のフィールド(処理不要)があります.
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/')