使用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/