Flask请求和application / json内容类型

时间:2013-01-01 17:00:11

标签: python json dictionary flask mime-types

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

@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。

2 个答案:

答案 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.jsonhttp://flask.pocoo.org/docs/api/?highlight=json#flask.Request.json