自定义接受烧瓶的集管路由支持

flask_accept的Python项目详细描述


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

说明

自定义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

许可证

开源麻省理工许可证。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java IntelliJ找不到依赖项选项卡   java向字符串数组string[]添加元素并在Junit中测试结果   如何在eclipse中获取活动java项目的名称   如何使用java在mysql中插入时间   java ArrayList更新了插入一行,但Jtable仍然没有刷新   如何在JavaSwing中命名坐标(点)   java Matcher/模式不打印   java错误地设置了arraylist   使用UsernamePasswordCredential提供程序的java列表Azure AD   java在HTTP请求中设置UTC时间   未加载事件:jquery完整日历Java集成   java Maven插件依赖项无法从内部repo解析依赖项   Maven更新重置Java版本   java如何向中添加图片。带有Apache POI XWPF的docx,但不指定其大小   Java最大函数递归