簡體   English   中英

Flask jsonify 返回字節和字符串而不是 json object

[英]Flask jsonify returns bytes and string instead of json object

在 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' object 不可調用

這是返回 jsonify 的 function

# # 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"])

成功添加新咖啡廳。

嘿,您可以使用 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"])

有關更多信息,請查看有關 JSON 的文檔

如果您需要序列化 numpy 數組,有一個關於如何將 numpy 數組序列化為 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'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM