2018年7月19日木曜日

flasgger 入門

概要

直接 swagger.yml の情報を Python のコードにも書けるのですが今回は YAML ファイルは分離して動かしてみたいと思います

環境

  • macOS X 10.13.6
  • Python 3.6.5
  • flasgger 0.9.0

インストール

  • pipenv install flasgger

swagger.yml 作成

  • vim test.yml
parameters:
  - name: palette
    in: path
    type: string
    enum: ['all', 'rgb', 'cmyk']
    required: true
    default: all
definitions:
  Palette:
    type: object
    properties:
      palette_name:
        type: array
        items:
          $ref: '#/definitions/Color'
  Color:
    type: string
responses:
  200:
    description: A list of colors (may be filtered by palette)
    schema:
      $ref: '#/definitions/Palette'
    examples:
      rgb: ['red', 'green', 'blue']

アプリ作成

  • vim test.py
from flask import Flask, jsonify
from flasgger import Swagger
from flasgger.utils import swag_from

app = Flask(__name__)
Swagger(app)

@app.route('/colors/<palette>/')
@swag_from('test.yml')
def index(palette):
    all_colors = {
        'cmyk': ['cian', 'magenta', 'yellow', 'black'],
        'rgb': ['red', 'green', 'blue']
    }
    if palette == 'all':
        result = all_colors
    else:
        result = {palette: all_colors.get(palette)}
    return jsonify(result)

app.run(debug=True)

単純な JSON を返却するだけのアプリです
定義した test.yml はデコレーションを使って参照します

@swag_from('test.yml')

Swagger(app) することで swagger UI と JSON を参照できるようにしています
あとは @app.route('/colors/<palette>/') デコレーションでルーティングを定義します
<palette> は関数内で変数として参照することができます

実行

  • pipenv run python3 test.py

localhost:5000 でアプリ起動します

動作確認

  • curl http://localhost:5000/colors/all/

で以下のレスポンスが返ってきます

{
  "cmyk": [
    "cian", 
    "magenta", 
    "yellow", 
    "black"
  ], 
  "rgb": [
    "red", 
    "green", 
    "blue"
  ]
}

http://localhost:5000/apidocs/ にアクセスすると swagger UI が表示されます

最後に

Python3 + flasgger を使って swagger.yml ファイルからアプリを作成してみました
これが基本的な使い方になると思います

少し気になったのはコントローラの分離方法です
やり方がわかったらこの辺りも紹介したいと思います

参考サイト

0 件のコメント:

コメントを投稿