自定义接受烧瓶的集管路由支持
flask_accept的Python项目详细描述
说明
自定义Accept烧瓶头路由支持。
功能
- 根据接受的mime类型做出不同的响应
- 扩展任何给定的端点以支持任何其他媒体类型。
- 使用自定义媒体类型来版本您的api
- 再也不要在uri中放入/v1/。
- dead简单api 又一个烧瓶装饰工。
文档
安装
安装:
$ pip install flask-accept
快速启动
下面是一个示例flask应用程序,它只接受text/html媒体类型:
fromflaskimportFlaskfromflask_acceptimportacceptapp=Flask(__name__)@app.route('/')@accept('text/html')defhello_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
添加对现有端点
的支持根据前面的示例,我们可以添加对 另一种媒体类型如下:
fromflaskimportFlask,jsonifyfromflask_acceptimportacceptapp=Flask(__name__)@app.route('/')@accept('text/html')defhello_world():return'Hello World!'@hello_world.support('application/json')defhello_world_json():returnjsonify(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如下:
fromflaskimportFlask,jsonifyfromflask_acceptimportaccept,accept_fallbackapp=Flask(__name__)@app.route('/')@accept_fallbackdefhello_world():return'Hello World!'@hello_world.support('application/json')defhello_world_json():returnjsonify(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
用例
一些可能的烧瓶用例可以接受。
API版本控制
烧瓶接受允许您接受任何可能的媒体类型,包括custom vendored media types。这是 非常适合仅使用Accept头对api进行版本控制:
fromflaskimportFlask,jsonifyfromflask_acceptimportacceptapp=Flask(__name__)@app.route('/')@accept('application/vnd.your_vendor.v1','application/vnd.your_vendor.v2')defhello_world():return'Hello World!'@hello_world.support('application/vnd.your_vendor.v3')defhello_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.
使用烧瓶restful资源
同样的功能也可以应用于使用flask restful构建的api
fromflaskimportFlask,jsonifyfromflask_acceptimportacceptfromflask_restfulimportResource,Apiapp=Flask(__name__)api=Api(app)classHelloWorldResource(Resource):@accept('application/vnd.your_vendor.v1','application/vnd.your_vendor.v2')defget():return'Hello World!'@get.support('application/vnd.your_vendor.v3')defget_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.
使用烧瓶restplus资源
同样的功能也可以应用于用Flask-RESTPlus
fromflaskimportFlask,jsonifyfromflask_acceptimportacceptfromflask_restplusimportResource,Apiapp=Flask(__name__)api=Api(app)classHelloWorldResource(Resource):@accept('application/vnd.your_vendor.v1','application/vnd.your_vendor.v2')defget():""" The doc string showing in swagger """return'Hello World!'@get.support('application/vnd.your_vendor.v3')defget_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
许可证
开源麻省理工许可证。