【问题标题】:Flask request and application/json content typeFlask 请求和 application/json 内容类型
【发布时间】:2012-12-16 05:55:21
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我是否正确地阅读了您只想在响应中返回请求数据的内容?那么如何确保获得 JSON?

标签: python json dictionary flask mime-types


【解决方案1】:

使用request.get_json() 并将force 设置为True

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

来自文档:

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

参数:

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

对于较旧的 Flask 版本,

from flask import json

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

【讨论】:

  • 这就是我最终做的:)
  • @RonReiter:为什么不呢?我们采用客户端指定的内容类型的request.data不管。当然,如果客户端发送了无效的请求数据(例如不是(有效的)JSON),则什么也做不了。
  • @MartijnPieters request.data 在使用 www/form-url-encoded 时是一个空字符串,因为它会将其解析为表单。来自文档: data - 包含传入的请求数据作为字符串,以防它带有 mimetype Flask 无法处理。
  • 是的,在狭隘的情况下,客户端完全错误地标记了请求,上述将失败。这种情况的可能性有多大,对于许多其他客户端错误请求的情况来说不是这样吗?
  • @TonyChou:对 Content-Type 标头进行门控是及早阻止不良客户端的一种方法。如果您使用 force=True 只是因为某些客户端可能忘记设置标头,那么您的服务器将不得不做更多的工作(因为现在所有请求都可能包含 JSON 并且花费时间尝试全部解码)。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-08-01
    • 2015-09-07
    • 1970-01-01
    • 2013-06-28
    • 2018-03-22
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 2020-03-20
    相关资源
    最近更新 更多