我想根据 Accept HTTP header 路由到不同的 Flask View ,例如:
@api.route('/test', accept='text/html')
def test_html():
return "<html><body>Test</body></html>"
@api.route('/test', accept='text/json')
def test_json():
return jsonify(test="Test")
我没有在Werkzeug Rule constructor中找到相关选项,由 Flask 使用。它是缺少的功能还是有可能以不同的方式实现相同的效果,例如通过在路由之前拦截和修改 URL 路径?
我不想将 View 合并为一个 View ,因为这会使代码显着复杂化,它们有很多,而且它们位于不同的蓝图中。
我知道 similar question已被问到,但没有人使用 Flask 回答。可以在不同的 Web 框架中执行此操作,例如在 Pyramid 中使用 predicates - 示例代码可以在 this answer 中找到.
最佳答案
我知道这是一个老问题,但我最终在这里寻找类似的东西,所以我希望它能帮助其他人。
flask_accept具有通过不同路由处理不同 Accept 类型的功能。
from flask import Flask, jsonify
from flask_accept import accept
app = Flask(__name__)
@app.route('/')
@accept('text/html')
def hello_world():
return 'Hello World!'
@hello_world.support('application/json')
def hello_world_json():
return jsonify(result="Hello World!")
if __name__ == '__main__':
app.run()
如果您只想根据请求是否为特定数据类型来拒绝请求,您也可以使用 Flask-Negotiate
from flask import Flask
from flask_negotiate import consumes, produces
app = Flask(__name__)
@app.route('/consumes_json_only')
@consumes('application/json')
def consumes_json_only():
return 'consumes json only'
When one tries to access the endpoint without a valid Accept header:
$ curl localhost:5000 -I
HTTP 415 (Unsupported Media Type)
关于python - 基于 Flask 中的 Accept header 路由请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28791613/