Swagger 使用 Flask-Restplus、API 和多个蓝图

dac*_*oda 6 python flask swagger flask-restplus

我正在使用 Flask 和 Flask-Restplus 构建一个非常复杂的微服务。
它将有许多端点,因此我将每个端点组织成一个单独的蓝图。

  • 目前,我正在努力使用多个蓝图与 swagger 结合使用Flask-Restplus 和 API
  • 我希望能够将我的蓝图的所有端点放入 API 的内置招摇中,但这似乎不起作用。
  • 我可以通过邮递员访问我的端点,但 swagger-UI 没有显示任何内容。:(

下面的示例代码和目录结构应该会给你一个我的想法的提示:

.
??? endpoints
?   ??? endpointa.py
?   ??? endpointb.py
?   ??? endpointc.py
?   ??? __init__.py
??? __init__.py
??? run.py
Run Code Online (Sandbox Code Playgroud)

我的主要init .py 看起来像这样:

from flask import Flask, Blueprint, logging, jsonify, request, Response
from flask_restplus import Resource, Api   


# create app and api
app = Flask(__name__)
api_prefix  = '/api/v1/'

# register Blueprints
from endpoints.endpointa import endpointa_api
app.register_blueprint(endpointa_api, url_prefix=api_prefix)

from endpoints.endpointb import endpointb_api
app.register_blueprint(endpointb_api, url_prefix=api_prefix)

from endpoints.endpointc import endpointc_api
app.register_blueprint(endpointc_api, url_prefix=api_prefix)


api = Api(app,
          version='1',
          title='Test Service REST-API',
          description='A REST-API for the Test Service, implemented in python')


if __name__ == '__main__':
    app.run(debug=True, host="0.0.0.0", port=5060)
Run Code Online (Sandbox Code Playgroud)

带有相应蓝图的 endpointa.py:

from os import environ
import json, ast, syslog
import requests
import gc
from flask import Flask, Blueprint, logging, jsonify, request, Response
from flask_restplus import Resource, Api

endpointa_api = Blueprint('endpointa_api', __name__)

@endpointa_api.route('testa', methods=['GET'])
def testa():
    ...


@endpointa_api.route('testa/<string:testa_id>', methods=['GET', 'POST'])
def testa_id():
    ...
Run Code Online (Sandbox Code Playgroud)

再次:

我可以通过邮递员访问我的端点,但 swagger-UI 没有显示任何内容:

在此处输入图片说明

通常我会使用类似的东西向 API 添加端点

api.add_resource(TestClass, api_prefix + 'test')
Run Code Online (Sandbox Code Playgroud)

但这对于多个蓝图似乎是不可能的。

谁能告诉我如何使用 Api 添加/注册这些蓝图(endpointa_api、endpointb_api 和 endpointc_api)?

Rob*_*bbe 9

使用 Flask-Restplus 有两种可能的解决方案:

  • 使用 Flask-RestPlus 命名空间
  • 把你的蓝图变成 Flask-RestPlus Apis

您可以在文档中阅读这两者:https : //flask-restplus.readthedocs.io/en/stable/scaling.html

命名空间

Flask-RESTPlus 提供了一种使用与 Flask 蓝图几乎相同的模式的方法。主要思想是将您的应用程序拆分为可重用的命名空间。

from flask_restplus import Api

from .namespace1 import api as ns1
from .namespace2 import api as ns2
# ...
from .namespaceX import api as nsX

api = Api(
    title='My Title',
    version='1.0',
    description='A description',
    # All API metadatas
)

api.add_namespace(ns1)
api.add_namespace(ns2)
# ...
api.add_namespace(nsX)
Run Code Online (Sandbox Code Playgroud)

蓝图蜜蜂

下面是如何将 Api 链接到蓝图的示例。

from flask import Blueprint
from flask_restplus import Api

blueprint = Blueprint('api', __name__)
api = Api(blueprint)
# ...
Run Code Online (Sandbox Code Playgroud)

使用蓝图将允许您在应用程序中的任何 url 前缀和/或子域上安装您的 API:

from flask import Flask
from apis import blueprint as api

app = Flask(__name__)
app.register_blueprint(api, url_prefix='/api/1')
app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你。蓝图 API:这是将 Api 链接到一个蓝图的示例,但我希望能够将一个 Api 链接到多个蓝图。 (2认同)