使用flask_restplus構建Microservice服務
swagger是什么就不必贅述了, 現在基本上已經成了事實上的工業(yè)標準,所有的restful api,要么自己寫一坨惡心的靜態(tài)頁面來介紹自己的restful api的使用,要么使用swagger 簡潔清爽的展示。
安裝
如果有pypi,照舊還是使用: pip install flask_restplus
如果沒有pypi,就略麻煩,需要看下swagger的版本號,我當前的環(huán)境是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/