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)