zoukankan      html  css  js  c++  java
  • 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")
    

      

  • 相关阅读:
    POJ 1015 Jury Compromise【DP】
    POJ 1661 Help Jimmy【DP】
    HDU 1074 Doing Homework【状态压缩DP】
    HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
    占坑补题。。最近占的坑有点多。。。
    Codeforces 659F Polycarp and Hay【BFS】
    Codeforces 659E New Reform【DFS】
    Codeforces 659D Bicycle Race【计算几何】
    廖大python实战项目第四天
    廖大python实战项目第三天
  • 原文地址:https://www.cnblogs.com/sddai/p/13690928.html
Copyright © 2011-2022 走看看