【发布时间】:2015-05-01 17:33:54
【问题描述】:
我想根据 Accept HTTP 标头路由到不同的 Flask 视图,例如:
@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 路径?
我不想将视图合并为一个,因为这会使代码变得非常复杂,其中有很多并且它们驻留在不同的蓝图中。
我知道有人问过similar question,但没有人使用 Flask 回答它。可以在不同的 Web 框架中执行此操作,例如在 Pyramid 中使用 predicates - 示例代码可以在 this answer 中找到。
【问题讨论】:
-
Flask-Restful 做了一些类似的;它具有根据
Accept标头格式化视图结果的可插拔支持。默认情况下它只支持 JSON,但可以扩展。见Content Negotiation。 -
它的方法是不同的;它以pluggable views 为基础进行最终路由; Flask 已经提供了基于方法的调度,我相信同样的技术可以用于以类似的方式进行基于接受的调度。
-
@MartijnPieters 谢谢,这很有趣。我相信 Flask 使用 Werkzeug 来做基于 HTTP 方法的路由。可插拔视图可以帮助更好地组织代码,但这并不理想,因为最终我只注册了一个路由。
-
是的,Werkzeug 负责路由,并且该机制不支持基于标头的路由。它只支持方法,扩展它并不容易。
-
如果有人感兴趣,我写了一个decorator,它允许在 Flask 中进行这种路由。
标签: python flask http-headers werkzeug