构建基于Flask和Swagger的restful service

使用flask_restplus构建Microservice服务

swagger是什么就不必赘述了, 现在基本上已经成了事实上的工业标准,所有的restful api,要么自己写一坨恶心的静态页面来介绍自己的restful api的使用,要么使用swagger 简洁清爽的展示。

安装

如果有pypi,照旧还是使用: pip install flask_restplus
如果没有pypi,就略麻烦,需要看下swagger的版本号,我当前的环境是2.2.6版本,就需要先安装好模块相关的依赖之后,将swagger的2.26版本放入 flask_restplus目录之中,然后重命名为static,最后输入:python setup.py develop

构建简单的restful api

from flask import Flask
from flask_restplus import Api, Resource, fields

app = Flask(__name__)
api = Api(app)

@api.route('/language')
class language(Resource):
    def get(self):
        return {'hi': 'there'}

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

然后打开http://127.0.0.1:5000,直接就可以看到swagger的页面,点击"Try it out"按钮,就可以看得到想要的{'hi': 'there'}页面了。

但这也太简单了,我们使用restful api的目的还是要和server端的后台进行交互,而不是返回一个固定的值。

from flask import Flask
from flask_restplus import Api, Resource, fields

app = Flask(__name__)
api = Api(app)

languages = list()
python = {'language': 'python'}
languages.append(python)

@api.route('/language')
class language(Resource):
    def get(self):
        return languages

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

这样就实现了一个简单的交互,从后台取出相应的数据。

但是这仅仅只是取数据,并没有办法添加数据,这时候可以用post方法。

from flask import Flask
from flask_restplus import Api, Resource, fields

app = Flask(__name__)
api = Api(app)

a_language = api.model('language', {
    'language': fields.String('TheLanguage')
})

languages = list()
python = {'language': 'python'}
languages.append(python)

@api.route('/language')
class language(Resource):
    def get(self):
        return languages

    @api.expect(a_language)
    def post(self):
        languages.append(api.payload)
        return {'result': 'language added'}, 201

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

这时候看起来还不错,在右边的example中,可以直接点击,就插入了payload框中。

然后在post页面中添加内容,在get页面中就可以看到,用swagger测试,很直接。

from flask import Flask
from flask_restplus import Api, Resource, fields

app = Flask(__name__)
api = Api(app)

a_language = api.model('language', {
    'language': fields.String('TheLanguage')
})

languages = list()
python = {'language': 'python', 'id': 1}
languages.append(python)

@api.route('/language')
class language(Resource):
    @api.marshal_with(a_language)
    def get(self):
        return languages

    @api.expect(a_language)
    def post(self):
        new_language = api.payload
        new_language['id'] = len(languages) + 1
        languages.append(new_language)
        return {'result': 'language added'}, 201

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

我们在这里使用了marshal_with函数来限定了返回的格式,此时我们虽然在python字典里面初始化了id,但是在a_language这个对象里没有定义。

from flask import Flask
from flask_restplus import Api, Resource, fields

app = Flask(__name__)
api = Api(app)

a_language = api.model('language', {
    'language': fields.String('TheLanguage')
    'id': fields.Integer('ID')
})

languages = list()
python = {'language': 'python', 'id': 1}
languages.append(python)

@api.route('/language')
class language(Resource):
    @api.marshal_with(a_language, envelope='data') # envelope在这里
    def get(self):
        return languages

    @api.expect(a_language)
    def post(self):
        new_language = api.payload
        new_language['id'] = len(languages) + 1
        languages.append(new_language)
        return {'result': 'language added'}, 201

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

简单说这些,很多都是基于这个blog:http://michal.karzynski.pl/blog/2016/06/19/building-beautiful-restful-apis-using-flask-swagger-ui-flask-restplus/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容