• SQLAchemy ORM 返回json给前端


    在python中可以使用json将数据格式化为JSON格式:

    1.将字典转换成JSON数据格式:

    1.  
      s=['张三','年龄','姓名']
    2.  
      t={}
    3.  
      t['data']=s
    4.  
      return json.dumps(t,ensure_ascii=False)

    2.将列表转换成JSON数据格式:

    1.  
      s=['张三','年龄','姓名']
    2.  
      return json.dumps(s,ensure_ascii=False)



    使用json转换的在前端显示的数据为JSON字符串。

    使用flask的jsonify转换后,在前台显示的为JSON对象:

    1.  
      s=['张三','年龄','姓名']
    2.  
      return jsonify(s)

    1.  
      s=['张三','年龄','姓名']
    2.  
      t={}
    3.  
      t['data']=s
    4.  
      return jsonify(t)



    需要返回多条记录时:

    1.  
      s=['张三','年龄','姓名']
    2.  
      t={}
    3.  
      for num in range(1,5):
    4.  
      t[str(num)]=s
    5.  
      return jsonify(t)


    或者:

    1.  
      s=['张三','年龄','姓名']
    2.  
      t={}
    3.  
      for num in range(1,5):
    4.  
      t[str(num)]=s
    5.  
      data={}
    6.  
      data['SUCCESS']='SUCCESS'
    7.  
      data['data']=t
    8.  
      return jsonify(data)

    json也可以:

    1.  
      s=['张三','年龄','姓名']
    2.  
      t={}
    3.  
      for num in range(1,5):
    4.  
      t[str(num)]=s
    5.  
      data={}
    6.  
      data['SUCCESS']='SUCCESS'
    7.  
      data['data']=t
    8.  
      return json.dumps(data,ensure_ascii=False)

    对于python的类转JSON,首先在模型文件中导入:

    from sqlalchemy.orm import class_mapper

    在模型类中加入一个方法:

    1.  
      def as_dict(obj):
    2.  
      # return {c.name: getattr(self, c.name) for c in self.__table__.columns}
    3.  
      #上面的有缺陷,表字段和属性不一致会有问题
    4.  
      return dict((col.name, getattr(obj, col.name))
    5.  
      for col in class_mapper(obj.__class__).mapped_table.c)

    调用:

    1.  
      users=User.query.all();
    2.  
      dict={}
    3.  
      for i in users:
    4.  
      dict[repr(i.id)]=i.as_dict()

    前端显示:

    使用flask+SQLAchemy这个ORM时,定义的模型类不能使用

    json.dumps(user, default=lambda o: o.__dict__, sort_keys=True, indent=4)
    这种方式格式化。
    使用
    user.__dict__.keys()获取的属性会多出一个属性。
    在python中定义的一般类,如:
    1.  
      class Test(object):
    2.  
      def __init__(self,name,age):
    3.  
      self.name=name
    4.  
      self.age=age
    python中的普通类可以直接格式化:
    1.  
      test=Test('张三',21)
    2.  
      print(json.dumps(test,default=lambda o: o.__dict__,sort_keys=True, indent=4,ensure_ascii=False))


    FLASK 中如何获取 GET/POST 请求的参数

    一般来说,传递请求参数的方式有两种,一是打包成 JSON 之后再传递,二是直接放进 URL 进行传递 。对于第一种方式,一般用 POST 请求来传递参数,然后用 FLASK 中 request 模块的 get_json() 方法获取参数。而对于第二种方式,一般用 GET 请求传递参数,然后从 request.args 中用 get() 方法获取参数,不过需要说明的是用 POST 请求也可以通过 URL 的方式传递参数,而且获取参数的方式与 GET 请求相同。下面用代码来说明获取参数的过程。

    1. 获取 POST 请求参数

    from flask import request, jsonify
    
    @app.route('/', methods = ["POST"])
    def post_data():
    	# 假设有如下 JSON 数据
        #{"obj": [{"name":"John","age":"20"}] }
        
        # 方法一
        data = request.get_json()                # 获取 JSON 数据
        data = pd.DataFrame(data["obj"])   # 获取参数并转变为 DataFrame 结构
        
        # 方法二
        # data = request.json        # 获取 JOSN 数据
        # data = data.get('obj')     #  以字典形式获取参数
        
        # 经过处理之后得到要传回的数据
        res = some_function(data)
        
        # 将 DataFrame  数据再次打包为 JSON 并传回
        # 方法一
        res = '{{"obj": {} }}'.format(res.to_json(orient = "records", force_ascii = False))
        # 方法二
        # res = jsonify({"obj":res.to_json(orient = "records", force_ascii = False)})
        
        return res
    

      

    2. 获取 GET 请求参数

    @app.route('/', methods = ["GET","POST"])   # GET 和 POST 都可以
    def get_data():
        # 假设有如下 URL
        # http://10.8.54.48:5000/index?name=john&age=20
    
        #可以通过 request 的 args 属性来获取参数
        name = request.args.get("name")
        age = request.args.get("age")
        
        # 经过处理之后得到要传回的数据
        res= some_function(name, age)
        
        # 将数据再次打包为 JSON 并传回
        res = '{{"obj": {} }}'.format(res.to_json(orient = "records", force_ascii = False))
        
        return res
    

      

    3. 统一调用方法

    def request_parse(req_data):
    	'''解析请求数据并以json形式返回'''
        if req_data.method == 'POST':
            data = req_data.json
        elif req_data.method == 'GET':
            data = req_data.args
        return data
       
    @app.route('/', methods = ["GET","POST"])   # GET 和 POST 都可以
    def get_data():
    	data = request_parse(request)
    	# 假设有如下 URL
        # http://10.8.54.48:5000/index?name=john&age=20
        name = data.get("name")
        age = data.get("age")
    

      

  • 相关阅读:
    navigator对象及属性(userAgent)(扩展)
    最新Visual C++ 运行时
    Wakfu .pk 音频文件提取
    Flex布局学习记录
    小程序 swiper bindChange 抖动解决方法
    小程序 scroll-view 无法触发 onReachBottom 解决办法
    小程序修改按钮宽高
    db.collection(变量名)
    小程序图片轮播自适应
    微信小程序 MD5引用
  • 原文地址:https://www.cnblogs.com/sddai/p/13690928.html
Copyright © 2020-2023  润新知