我有一个带有以下视图的烧瓶应用程序:
@menus.route('/', methods=["PUT", "POST"])
def new():
return jsonify(request.json)
但是,这仅在请求的内容类型设置为application/json
时有效,否则dict request.json
为无。
我知道request.data
将请求主体作为字符串,但我不希望每次客户端忘记设置请求的内容类型时都将其解析为dict。
有没有办法假设每个传入请求的内容类型都是application/json
?我想要的是始终可以访问有效的request.json
dict,即使客户端忘记将应用程序内容类型设置为json。
答案 0 :(得分:49)
使用request.get_json()
并将force
设置为True
:
@menus.route('/', methods=["PUT", "POST"])
def new():
return jsonify(request.get_json(force=True))
来自文档:
默认情况下,如果mimetype为
application/json
,此函数将仅加载json数据,但 force 参数可以覆盖此函数。参数:
- 强制 - 如果设置为 True ,则忽略mimetype。
对于较旧的Flask版本,< 0.10,如果你想宽容并允许使用JSON,你可以自己明确地解码:
from flask import json
@menus.route('/', methods=["PUT", "POST"])
def new():
return jsonify(json.loads(request.data))
答案 1 :(得分:12)
request
对象已经有一个方法get_json
,如果你用force=True
执行它,它可以为你提供json而不管内容类型如何,所以你的代码将类似于以下内容:
@menus.route('/', methods=["PUT", "POST"])
def new():
return jsonify(request.get_json(force=True))
事实上,烧瓶文档说明应该使用request.get_json
而不是request.json
:http://flask.pocoo.org/docs/api/?highlight=json#flask.Request.json