python - 基于 Flask 中的 Accept header 路由请求

标签 python flask http-headers werkzeug

我想根据 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/

相关文章:

python - 如何使用 Python minidom 替换 xml 中的属性值

python - Shell 脚本打开 Flask 支持的网页会打开两个窗口

Flask 配置中的 Python @property?

rest - 我如何告诉我的前端后台作业已使用 Web 套接字完成?

Python Fabric 名称错误 : global name 'log_action' is not defined

python - Pandas 图值以递减的方式计算条形图

python - 确定测试是单元测试还是集成测试

Java Servlet 将数据传输到浏览器

java - GET 请求不适用于 Chrome --> net::ERR_CONTENT_LENGTH_MISMATCH

ajax - 我可以添加 Access-Control-Allow-Origin : * to the default headers