Flask-RESTX でサーバ起動せずにAPIドキュメントである swagger.json を取得したい場面がありました.
はじめに, Flaskアプリケーションのサンプルコードを示します.
from flask import Flask
from flask_restx import Api, Resource, fields
def create_app():
app = Flask(__name__)
api = Api(app)
@api.route("/sample")
class SampleResource(Resource):
@api.marshal_with(api.model("sample model", {
"name": fields.String,
"age": fields.Integer,
}))
def get(self):
raise NotImplementedError()
return app
flask run
で起動すると, http://127.0.0.1:5000/swagger.json へのアクセスで, swagger.json を取得できます.
しかし, この方法では swagger.json を得るために, デバッグサーバを起動する手間がかかってしまいます. CIなどを使って, 自動で swagger.json を取得して共有するなどしたいケースでやや難があります.
そこで次のようなスクリプトを用意して実行すると, Flaskサーバを立ち上げることなく, swagger.json を取り出すことができます.
import json
import sys
from app import create_app
app = create_app()
json.dump(
app.test_client().get("/swagger.json").get_json(),
sys.stdout,
)
Flaskに同梱されているテスト用クライアントを使っています.
このスクリプトでは標準出力にだしてますが, ファイルにリダイレクトするなりで, JSONファイルを取得できます.