Flask-restful:如何只响应附带的请求('Accept':'application/json')?

Posted

技术标签:

【中文标题】Flask-restful:如何只响应附带的请求(\'Accept\':\'application/json\')?【英文标题】:Flask-restful: How to only response to requests come with ('Accept':'application/json')?Flask-restful:如何只响应附带的请求('Accept':'application/json')? 【发布时间】:2015-02-14 17:40:09 【问题描述】:

我有一个 json api APP,运行良好。现在我希望它只接受和响应 json,而不是响应 text/html 请求。 应用如下所示:

class Books(Resource):
    def get(self):
        return json.dumps(data)

有人可以帮忙吗? 谢谢。

【问题讨论】:

【参考方案1】:

您可以使用预处理请求处理程序来拒绝所有具有错误 MimeType 的请求。 Request 对象的一个​​属性(没有文档记录,但至少存在于 Flask 0.10 上)名为 is_json

鉴于您的 Flask 应用程序被称为应用程序,您可以使用类似:

from flask import request, abort, jsonify

@application.before_request
def only_json():
    if not request.is_json: 
        abort(400)  # or any custom BadRequest message

我还将使用 Flask jsonify 函数来构建您的响应,它将确保响应在 json 中格式正确,并设置正确的标题。

class Books(Resource):
    def get(self):
        return jsonify(data)

【讨论】:

谢谢@afrancais,但是如果我要处理大量端点,如何在上层执行此操作? @longnight:before_request 装饰器应用于所有 Flask 应用程序端点。如果您只想在部分端点上应用此过滤器,您可以创建一个 Blueprint 实例并在蓝图而不是应用程序上应用 before_request 装饰器。对于返回值,没有什么神奇的方法。是的,有一个after_request 装饰器,但是当它被调用时,响应已经构建好了。我看到了两种强制 json 响应的方法:使用可应用于端点的装饰器,或者覆盖 Flask 类的 make_reponse 方法来强制 jsonify。 我的立场是正确的,您显然正在使用 Flask-restful 扩展,默认情况下它会生成 JSON 响应(通过覆盖 make_response 方法)。因此,您不必将请求的结果转储为 json,它是由您使用的框架自动生成的。 是的,我正在使用Flask-restful,我想做的是中止那些没有声称Accept: application/json 的请求,您的第一个解决方案app.before_request 已经指出了正确的方法,再次感谢:) 我相信is_json 是在this commit 中引入的。这意味着,它在 Flask 0.10.1 中不可用

以上是关于Flask-restful:如何只响应附带的请求('Accept':'application/json')?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用客户端上的“requests”模块和服务器上的“flask-restful”验证 https 请求的自签名证书(TLS1.2)

Flask-RESTful扩展

Flask-RESTful 请求解释

Flask-RESTful扩展

Flask-RESTful如何add_resource并传递非全局数据

如何使用 Flask-USER 管理保护 Flask-RESTful?