Python Flask 自动生成Swagger/OpenAPI 3.0
Python Flask automatically generated Swagger/OpenAPI 3.0
我正在尝试为我现有的 Flask 应用程序生成 swagger 文档,我最初尝试使用 Flask-RESTPlus
,发现该项目现在很丰富,并检查了分叉项目 flask-restx
https://github.com/python-restx/flask-restx但我仍然认为他们不支持 openapi 3.0
我有点困惑选择适合我需要的包。我想解决一个问题,我们不想为我们的 API 手动创建 swagger 文档,而是希望使用包自动生成。
import os
import requests
import json, yaml
from flask import Flask, after_this_request, send_file, safe_join, abort
from flask_restx import Resource, Api, fields
from flask_restx.api import Swagger
app = Flask(__name__)
api = Api(app=app, doc='/docs', version='1.0.0-oas3', title='TEST APP API',
description='TEST APP API')
response_fields = api.model('Resource', {
'value': fields.String(required=True, min_length=1, max_length=200, description='Book title')
})
@api.route('/compiler/', endpoint='compiler')
# @api.doc(params={'id': 'An ID'})
@api.doc(responses={403: 'Not Authorized'})
@api.doc(responses={402: 'Not Authorized'})
# @api.doc(responses={200: 'Not Authorized'})
class DemoList(Resource):
@api.expect(response_fields, validate=True)
@api.marshal_with(response_fields, code=200)
def post(self):
"""
returns a list of conferences
"""
api.payload["value"] = 'Im the response ur waiting for'
return api.payload
@api.route('/swagger')
class HelloWorld(Resource):
def get(self):
data = json.loads(json.dumps(api.__schema__))
with open('yamldoc.yml', 'w') as yamlf:
yaml.dump(data, yamlf, allow_unicode=True, default_flow_style=False)
file = os.path.abspath(os.getcwd())
try:
@after_this_request
def remove_file(resp):
try:
os.remove(safe_join(file, 'yamldoc.yml'))
except Exception as error:
log.error("Error removing or closing downloaded file handle", error)
return resp
return send_file(safe_join(file, 'yamldoc.yml'), as_attachment=True, attachment_filename='yamldoc.yml', mimetype='application/x-yaml')
except FileExistsError:
abort(404)
# main driver function
if __name__ == '__main__':
app.run(port=5003, debug=True)
上面的代码是我尝试不同包的组合,但它可以生成 swagger 2.0 文档,但我正在尝试为 openapi 3.0 生成文档
有人能推荐一个支持 openapi 3.0 方式生成 swagger yaml 的好包吗?json.
我找到了生成openapi 3.0文档的包
https://apispec.readthedocs.io/en/latest/install.html
这个包很好地达到了目的。详细使用方法见下方代码
from apispec import APISpec
from apispec.ext.marshmallow import MarshmallowPlugin
from apispec_webframeworks.flask import FlaskPlugin
from marshmallow import Schema, fields
from flask import Flask, abort, request, make_response, jsonify
from pprint import pprint
import json
class DemoParameter(Schema):
gist_id = fields.Int()
class DemoSchema(Schema):
id = fields.Int()
content = fields.Str()
spec = APISpec(
title="Demo API",
version="1.0.0",
openapi_version="3.0.2",
info=dict(
description="Demo API",
version="1.0.0-oas3",
contact=dict(
email="admin@donofden.com"
),
license=dict(
name="Apache 2.0",
url='http://www.apache.org/licenses/LICENSE-2.0.html'
)
),
servers=[
dict(
description="Test server",
url="https://resources.donofden.com"
)
],
tags=[
dict(
name="Demo",
description="Endpoints related to Demo"
)
],
plugins=[FlaskPlugin(), MarshmallowPlugin()],
)
spec.components.schema("Demo", schema=DemoSchema)
# spec.components.schema(
# "Gist",
# {
# "properties": {
# "id": {"type": "integer", "format": "int64"},
# "name": {"type": "string"},
# }
# },
# )
#
# spec.path(
# path="/gist/{gist_id}",
# operations=dict(
# get=dict(
# responses={"200": {"content": {"application/json": {"schema": "Gist"}}}}
# )
# ),
# )
# Extensions initialization
# =========================
app = Flask(__name__)
@app.route("/demo/<gist_id>", methods=["GET"])
def my_route(gist_id):
"""Gist detail view.
---
get:
parameters:
- in: path
schema: DemoParameter
responses:
200:
content:
application/json:
schema: DemoSchema
201:
content:
application/json:
schema: DemoSchema
"""
# (...)
return jsonify('foo')
# Since path inspects the view and its route,
# we need to be in a Flask request context
with app.test_request_context():
spec.path(view=my_route)
# We're good to go! Save this to a file for now.
with open('swagger.json', 'w') as f:
json.dump(spec.to_dict(), f)
pprint(spec.to_dict())
print(spec.to_yaml())
希望这对某人有帮助!! :)
更新:更详细的文档
Python Flask自动生成Swagger 3.0/Openapi文档-http://donofden.com/blog/2020/06/14/Python-Flask-automatically-generated-Swagger-3-0-openapi-Document
Python Flask自动生成Swagger 2.0文档-
http://donofden.com/blog/2020/05/30/Python-Flask-automatically-generated-Swagger-2-0-Document
我正在尝试为我现有的 Flask 应用程序生成 swagger 文档,我最初尝试使用 Flask-RESTPlus
,发现该项目现在很丰富,并检查了分叉项目 flask-restx
https://github.com/python-restx/flask-restx但我仍然认为他们不支持 openapi 3.0
我有点困惑选择适合我需要的包。我想解决一个问题,我们不想为我们的 API 手动创建 swagger 文档,而是希望使用包自动生成。
import os
import requests
import json, yaml
from flask import Flask, after_this_request, send_file, safe_join, abort
from flask_restx import Resource, Api, fields
from flask_restx.api import Swagger
app = Flask(__name__)
api = Api(app=app, doc='/docs', version='1.0.0-oas3', title='TEST APP API',
description='TEST APP API')
response_fields = api.model('Resource', {
'value': fields.String(required=True, min_length=1, max_length=200, description='Book title')
})
@api.route('/compiler/', endpoint='compiler')
# @api.doc(params={'id': 'An ID'})
@api.doc(responses={403: 'Not Authorized'})
@api.doc(responses={402: 'Not Authorized'})
# @api.doc(responses={200: 'Not Authorized'})
class DemoList(Resource):
@api.expect(response_fields, validate=True)
@api.marshal_with(response_fields, code=200)
def post(self):
"""
returns a list of conferences
"""
api.payload["value"] = 'Im the response ur waiting for'
return api.payload
@api.route('/swagger')
class HelloWorld(Resource):
def get(self):
data = json.loads(json.dumps(api.__schema__))
with open('yamldoc.yml', 'w') as yamlf:
yaml.dump(data, yamlf, allow_unicode=True, default_flow_style=False)
file = os.path.abspath(os.getcwd())
try:
@after_this_request
def remove_file(resp):
try:
os.remove(safe_join(file, 'yamldoc.yml'))
except Exception as error:
log.error("Error removing or closing downloaded file handle", error)
return resp
return send_file(safe_join(file, 'yamldoc.yml'), as_attachment=True, attachment_filename='yamldoc.yml', mimetype='application/x-yaml')
except FileExistsError:
abort(404)
# main driver function
if __name__ == '__main__':
app.run(port=5003, debug=True)
上面的代码是我尝试不同包的组合,但它可以生成 swagger 2.0 文档,但我正在尝试为 openapi 3.0 生成文档
有人能推荐一个支持 openapi 3.0 方式生成 swagger yaml 的好包吗?json.
我找到了生成openapi 3.0文档的包
https://apispec.readthedocs.io/en/latest/install.html
这个包很好地达到了目的。详细使用方法见下方代码
from apispec import APISpec
from apispec.ext.marshmallow import MarshmallowPlugin
from apispec_webframeworks.flask import FlaskPlugin
from marshmallow import Schema, fields
from flask import Flask, abort, request, make_response, jsonify
from pprint import pprint
import json
class DemoParameter(Schema):
gist_id = fields.Int()
class DemoSchema(Schema):
id = fields.Int()
content = fields.Str()
spec = APISpec(
title="Demo API",
version="1.0.0",
openapi_version="3.0.2",
info=dict(
description="Demo API",
version="1.0.0-oas3",
contact=dict(
email="admin@donofden.com"
),
license=dict(
name="Apache 2.0",
url='http://www.apache.org/licenses/LICENSE-2.0.html'
)
),
servers=[
dict(
description="Test server",
url="https://resources.donofden.com"
)
],
tags=[
dict(
name="Demo",
description="Endpoints related to Demo"
)
],
plugins=[FlaskPlugin(), MarshmallowPlugin()],
)
spec.components.schema("Demo", schema=DemoSchema)
# spec.components.schema(
# "Gist",
# {
# "properties": {
# "id": {"type": "integer", "format": "int64"},
# "name": {"type": "string"},
# }
# },
# )
#
# spec.path(
# path="/gist/{gist_id}",
# operations=dict(
# get=dict(
# responses={"200": {"content": {"application/json": {"schema": "Gist"}}}}
# )
# ),
# )
# Extensions initialization
# =========================
app = Flask(__name__)
@app.route("/demo/<gist_id>", methods=["GET"])
def my_route(gist_id):
"""Gist detail view.
---
get:
parameters:
- in: path
schema: DemoParameter
responses:
200:
content:
application/json:
schema: DemoSchema
201:
content:
application/json:
schema: DemoSchema
"""
# (...)
return jsonify('foo')
# Since path inspects the view and its route,
# we need to be in a Flask request context
with app.test_request_context():
spec.path(view=my_route)
# We're good to go! Save this to a file for now.
with open('swagger.json', 'w') as f:
json.dump(spec.to_dict(), f)
pprint(spec.to_dict())
print(spec.to_yaml())
希望这对某人有帮助!! :)
更新:更详细的文档
Python Flask自动生成Swagger 3.0/Openapi文档-http://donofden.com/blog/2020/06/14/Python-Flask-automatically-generated-Swagger-3-0-openapi-Document
Python Flask自动生成Swagger 2.0文档- http://donofden.com/blog/2020/05/30/Python-Flask-automatically-generated-Swagger-2-0-Document