31

我有一个具有以下视图的烧瓶应用程序:

@menus.route('/', methods=["PUT", "POST"])
def new():
    return jsonify(request.json)

但是,这仅在请求的内容类型设置为 时才有效application/json,否则 dictrequest.json为 None。

我知道request.data请求正文为字符串,但我不想每次客户端忘记设置请求的内容类型时都将其解析为字典。

有没有办法假设每个传入请求的内容类型都是application/json?我想要的只是始终可以访问有效的request.json字典,即使客户端忘记将应用程序内容类型设置为 json。

4

2 回答 2

58

使用request.get_json()并设置forceTrue

@menus.route('/', methods=["PUT", "POST"])
def new():
    return jsonify(request.get_json(force=True))

从文档中:

默认情况下,如果 mimetype 是,此函数将仅加载 json 数据,application/json但这可以被force参数覆盖。

参数:

  • force – 如果设置为True,则 mimetype 将被忽略。

对于较旧的 Flask 版本,< 0.10,如果您想宽容并允许 JSON,则始终可以明确地自己进行解码:

from flask import json

@menus.route('/', methods=["PUT", "POST"])
def new():
    return jsonify(json.loads(request.data))
于 2013-01-01T17:07:31.590 回答
13

request对象已经有一个方法get_json可以为您提供 json,如果您执行它,则不管内容类型如何,force=True因此您的代码将类似于以下内容:

@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

于 2013-10-25T13:03:21.283 回答