Flask jsonify 返回字节和字符串而不是 json 对象

时间:2021-01-25 15:17:32

标签: python json api flask jsonify

在 Postman post_new_cafe 打印 json 就像它想象的那样,但是当我想在控制台和网页中打印它时,它的打印方式不同。请参阅下面的示例。

@app.route('/add_form', methods=['GET', 'POST'])
def add_new_cafe_form():
    form = CafeForm()
    if form.validate_on_submit():
        response = post_new_cafe()
        print(response)
    return render_template("add.html", form=form)

打印出来

<响应 52 字节 [200 OK]>

@app.route('/add_form', methods=['GET', 'POST'])
def add_new_cafe_form():
    form = CafeForm()
    if form.validate_on_submit():
        response = post_new_cafe()
        print(response.response)
    return render_template("add.html", form=form)

打印出来

[b'{\n "success": "成功添加新咖啡馆。"\n}\n']

还有这个

@app.route('/add_form', methods=['GET', 'POST'])
def add_new_cafe_form():
    form = CafeForm()
    if form.validate_on_submit():
        response = post_new_cafe()
        print(response.json())
    return render_template("add.html", form=form)

报错

类型错误:“dict”对象不可调用

这是返回jsonify的函数

# # HTTP POST - Create Record
@app.route('/add', methods=['POST'])
def post_new_cafe():
    new_cafe = Cafe(
        name=request.form.get('name'),
        map_url=request.form.get('map_url'),
        img_url=request.form.get('img_url'),
        location=request.form.get('location'),
        seats=request.form.get('seats'),
        has_toilet=bool(strtobool(request.form.get('has_toilet'))),
        has_wifi=bool(strtobool(request.form.get('has_wifi'))),
        has_sockets=bool(strtobool(request.form.get('has_sockets'))),
        can_take_calls=bool(strtobool(request.form.get('can_take_calls'))),
        coffee_price=request.form.get('coffee_price')
    )
    # db.session.add(new_cafe)
    # db.session.commit()
    return jsonify(success="Successfully added the new cafe.")

我已经试过了

resp = Response(response={"success":"Successfully added the new cafe."},
                status=200,
                mimetype="application/json")
return jsonify(resp)

它不起作用,我也试过使用 make_response 仍然没有。

我想要的是当我将 post_new_cafe() 存储到响应变量中时有这个

response = post_new_cafe()
data = response.json()
print(data)

{"success": "成功添加新咖啡馆。"}

print(data["success"])

已成功添加新咖啡馆。

1 个答案:

答案 0 :(得分:0)

嘿,你可以用 json 库解决这个问题。

示例:

import json

def post_new_cafe():
    new_cafe = Cafe(
        name=request.form.get('name'),
        map_url=request.form.get('map_url'),
        img_url=request.form.get('img_url'),
        location=request.form.get('location'),
        seats=request.form.get('seats'),
        has_toilet=bool(strtobool(request.form.get('has_toilet'))),
        has_wifi=bool(strtobool(request.form.get('has_wifi'))),
        has_sockets=bool(strtobool(request.form.get('has_sockets'))),
        can_take_calls=bool(strtobool(request.form.get('can_take_calls'))),
        coffee_price=request.form.get('coffee_price')
    )
    return json.dumps({"success": "Succesfully added the new cafe."})

response = post_new_cafe()
data = json.loads(response)
print(data)
print(data["success"])

有关详细信息,请查看 Documentation about JSON

如果需要序列化一个numpy数组,how to serialize a numpy array as JSON上有个问题

关于您的其他问题:

@app.route('/add_form', methods=['GET', 'POST'])
def add_new_cafe_form():
    form = CafeForm()
    if form.validate_on_submit():
        response = post_new_cafe()
        print(response.json())
    return render_template("add.html", form=form)

您需要先将响应从二进制转换为字符串:response.decode('utf-8'),然后将其解析为 JSON:json.loads(response.decode('utf-8'))