跳转到主要内容

为Flask提供自定义Accept头路由支持

项目描述

https://travis-ci.org/di/flask-accept.svg?branch=master

描述

为Flask提供自定义Accept头路由支持。

特性

根据接受的MIME类型做出不同响应

扩展任何给定的端点以支持任何额外的媒体类型。

使用自定义媒体类型来对API进行版本控制

永远不要再在URI中放置/v1/

简单API

又一个Flask装饰器。

文档

安装

安装

$ pip install flask-accept

快速入门

以下是一个示例Flask应用,它只接受text/html媒体类型

from flask import Flask
from flask_accept import accept
app = Flask(__name__)

@app.route('/')
@accept('text/html')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

当尝试访问没有有效Accept头的端点时

$ curl localhost:5000 -I
HTTP/1.0 406 NOT ACCEPTABLE

带有有效头的情况

$ curl localhost:5000 -I -H "Accept: text/html"
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8

添加对现有端点的支持

根据我们之前的示例,我们可以添加对其他媒体类型的支持,如下所示

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()

现在我们的hello_world端点支持JSON

$ curl localhost:5000 -I -H "Accept: application/json"
HTTP/1.0 200 OK
Content-Type: application/json

回退到默认端点

如果我们想要支持特定的媒体类型,但其他所有请求都回退到默认端点,我们可以使用accept_fallback如下所示

from flask import Flask, jsonify
from flask_accept import accept, accept_fallback
app = Flask(__name__)

@app.route('/')
@accept_fallback
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()

我们的 hello_world 端点仍然支持 JSON,但对于任何其他媒体类型(或未指定时)将回退

$ curl localhost:5000 -I
HTTP/1.0 200 OK
Content-Type: text/html

$ curl localhost:5000 -I -H "Accept: madeup/mediatype"
HTTP/1.0 200 OK
Content-Type: text/html

使用场景

Flask-Accept 的某些可能使用场景。

API 版本化

Flask-Accept 允许接受任何可能的媒体类型,包括 自定义供应商媒体类型。这对于仅使用 Accept 头部进行 API 版本化非常理想

from flask import Flask, jsonify
from flask_accept import accept
app = Flask(__name__)

@app.route('/')
@accept('application/vnd.your_vendor.v1', 'application/vnd.your_vendor.v2')
def hello_world():
    return 'Hello World!'

@hello_world.support('application/vnd.your_vendor.v3')
def hello_world_v2():
    return 'Goodbye cruel world.'

if __name__ == '__main__':
    app.run()
$ curl localhost:5000 -H "Accept: application/vnd.your_vendor.v1"
Hello World!

$ curl localhost:5000 -H "Accept: application/vnd.your_vendor.v2"
Hello World!

$ curl localhost:5000 -H "Accept: application/vnd.your_vendor.v3"
Goodbye cruel world.

与 Flask-RESTful 资源一起使用

可以将相同的功能应用于使用 Flask-RESTful 构建的 API

from flask import Flask, jsonify
from flask_accept import accept
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)


class HelloWorldResource(Resource):
    @accept('application/vnd.your_vendor.v1', 'application/vnd.your_vendor.v2')
    def get():
        return 'Hello World!'

    @get.support('application/vnd.your_vendor.v3')
    def get_v2():
        return 'Goodbye cruel world.'


api.add_resource(HelloWorldResource, '/')

if __name__ == '__main__':
    app.run()
$ curl localhost:5000 -H "Accept: application/vnd.your_vendor.v1"
Hello World!

$ curl localhost:5000 -H "Accept: application/vnd.your_vendor.v2"
Hello World!

$ curl localhost:5000 -H "Accept: application/vnd.your_vendor.v3"
Goodbye cruel world.

与 Flask-RESTPlus 资源一起使用

可以将相同的功能应用于使用 Flask-RESTPlus 构建的 API

from flask import Flask, jsonify
from flask_accept import accept
from flask_restplus import Resource, Api
app = Flask(__name__)
api = Api(app)


class HelloWorldResource(Resource):
    @accept('application/vnd.your_vendor.v1', 'application/vnd.your_vendor.v2')
    def get():
    """
        The doc string showing in swagger
    """
        return 'Hello World!'

    @get.support('application/vnd.your_vendor.v3')
    def get_v2():
        return 'Goodbye cruel world.'


api.add_resource(HelloWorldResource, '/')

if __name__ == '__main__':
    app.run()
$ curl localhost:5000 -H "Accept: application/vnd.your_vendor.v1"
Hello World!

$ curl localhost:5000 -H "Accept: application/vnd.your_vendor.v2"
Hello World!

$ curl localhost:5000 -H "Accept: application/vnd.your_vendor.v3"
Goodbye cruel world.

测试

要运行测试

python setup.py test

作者

许可证

开源 MIT 许可证。

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

flask_accept-0.0.6.tar.gz (4.4 kB 查看散列)

上传时间

构建分布

flask_accept-0.0.6-py3-none-any.whl (3.8 kB 查看散列)

上传时间 Python 3

由以下机构支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面