SQLAchemy ORM 返回json给前端
在python中可以使用json将数据格式化为JSON格式:
1.将字典转换成JSON数据格式:
-
s=['张三','年龄','姓名']
-
t={}
-
t['data']=s
-
return json.dumps(t,ensure_ascii=False)
2.将列表转换成JSON数据格式:
-
s=['张三','年龄','姓名']
-
return json.dumps(s,ensure_ascii=False)
使用json转换的在前端显示的数据为JSON字符串。
使用flask的jsonify转换后,在前台显示的为JSON对象:
-
s=['张三','年龄','姓名']
-
return jsonify(s)
-
s=['张三','年龄','姓名']
-
t={}
-
t['data']=s
-
return jsonify(t)
需要返回多条记录时:
-
s=['张三','年龄','姓名']
-
t={}
-
for num in range(1,5):
-
t[str(num)]=s
-
return jsonify(t)
或者:
-
s=['张三','年龄','姓名']
-
t={}
-
for num in range(1,5):
-
t[str(num)]=s
-
data={}
-
data['SUCCESS']='SUCCESS'
-
data['data']=t
-
return jsonify(data)
json也可以:
-
s=['张三','年龄','姓名']
-
t={}
-
for num in range(1,5):
-
t[str(num)]=s
-
data={}
-
data['SUCCESS']='SUCCESS'
-
data['data']=t
-
return json.dumps(data,ensure_ascii=False)
对于python的类转JSON,首先在模型文件中导入:
from sqlalchemy.orm import class_mapper
在模型类中加入一个方法:
-
def as_dict(obj):
-
# return {c.name: getattr(self, c.name) for c in self.__table__.columns}
-
#上面的有缺陷,表字段和属性不一致会有问题
-
return dict((col.name, getattr(obj, col.name)) \
-
for col in class_mapper(obj.__class__).mapped_table.c)
调用:
-
users=User.query.all();
-
dict={}
-
for i in users:
-
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中定义的一般类,如:
-
class Test(object):
-
def __init__(self,name,age):
-
self.name=name
-
self.age=age
python中的普通类可以直接格式化:
-
test=Test('张三',21)
-
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")
如果这篇文章帮助到了你,你可以请作者喝一杯咖啡