在前后端分离的时代,后端一般返回前端的数据就是json格式的响应数据。
而json格式的响应数据其实实际上就是一个字符串。
要知道Flask如何返回json响应数据,首先就需要知道如何将字典dict转化为json字符串。
使用json库将dict转为json字符串
In [1]: import json
In [2]: data = {"user_name":"libai", "user_pwd": "123456"}
In [3]: type(data)
Out[3]: dict
# 将dict转为json字符串
In [4]: res = json.dumps(data)
In [5]: res
Out[5]: '{"user_name": "libai", "user_pwd": "123456"}'
In [6]: type(res)
Out[6]: str
# 将json字符串转为dict
In [7]: rec = json.loads(res)
In [9]: rec
Out[9]: {'user_name': 'libai', 'user_pwd': '123456'}
In [10]: type(rec)
Out[10]: dict
下面来看看使用json库来返回json数据。
视图函数使用json库返回json响应数据
from flask import Flask, request, abort, make_response
import json
# 实例化app
app = Flask(import_name=__name__)
@app.route('/login', methods=["GET","POST"])
def login():
data = {
"user_name": "libai",
"user_age": 18,
}
res_json = json.dumps(data)
return res_json
if __name__ == '__main__':
app.run(debug=True)
在浏览器请求如下:
如果单纯直接返回响应消息,Content-Type:text/html
是不正确的,应该改为application/json
才对。
修改响应消息的headers如下:
from flask import Flask, request, abort, make_response
import json
# 实例化app
app = Flask(import_name=__name__)
@app.route('/login', methods=["GET","POST"])
def login():
data = {
"user_name": "libai",
"user_age": 18,
}
res_json = json.dumps(data)
# return 响应体, 状态码, 响应头
return res_json, 200, {"Content-Type":"application/json"}
if __name__ == '__main__':
app.run(debug=True)
在浏览器的请求响应如下:
可以看到正常返回json数据了。
但是可以感觉到这样其实挺麻烦的。在Flask框架中有一个jsonify
的方法可以将这个过程简化。
使用jsonify来返回json响应数据
from flask import Flask, jsonify
# 实例化app
app = Flask(import_name=__name__)
@app.route('/login', methods=["GET","POST"])
def login():
data = {
"user_name": "libai",
"user_age": 18,
}
return jsonify(data)
if __name__ == '__main__':
app.run(debug=True)
浏览器请求如下:
可以看到,使用jsonify
返回json响应数据是最简单的一种方式。
- 另外
jsonify
不单单可以将dict转为json响应数据,还可以直接往里面写参数值
jsonify(token=123456, gender=0)
示例如下:
from flask import Flask, jsonify
# 实例化app
app = Flask(import_name=__name__)
@app.route('/login', methods=["GET","POST"])
def login():
return jsonify(token=123456, gender=0)
if __name__ == '__main__':
app.run(debug=True)
浏览器请求如下: