Swagger与Flask-Restplus,API和多个蓝图

7

I'm building a very complex microservice using Flask and Flask-Restplus.
It will have many endpoints, thus I'm organizing each endpoint into a separate Blueprint.

  • Currently, I'm struggling with the usage of Flask-Restplus and API using multiple Blueprints in combination with swagger
  • I want to be able to get all the endpoints of my blueprints into the built-in swagger of API, but this doesn't seem to work.
  • I can access my endpoints via postman, but the swagger-UI doesn't show anything. :(

The following example code and directory structure should give you a hint towards my idea:

.
├── endpoints
│   ├── endpointa.py
│   ├── endpointb.py
│   ├── endpointc.py
│   └── __init__.py
├── __init__.py
└── run.py

My main init.py looks like this:

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)

endpointa.py with the corresponding Blueprint:

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():
    ...

Again:

I can access my endpoints via postman, but the swagger-UI doesn't show anything:

enter image description here

Normally I would add endpoints to API using something like

api.add_resource(TestClass, api_prefix + 'test')

but this doesn't seem to be possible with multiple Blueprints.

Can anyone show me how to add/register these Blueprints (endpointa_api, endpointb_api and endpointc_api) with Api ?


1
非常复杂的微服务有点自相矛盾 :) - Adrian Krupa
你是在使用 Flask-RESTful 还是 Flask-RESTPlus?因为你正在描述第一个,而示例使用的是后者。 - Adrian Krupa
抱歉,我更新了我的帖子。我正在使用flask-restplus尝试将所有蓝图注册到swagger。 - dacoda
可能 Flask-RESTful 已经死了! - akpp
1个回答

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)

蓝图API

下面是将API链接到蓝图的示例。

from flask import Blueprint
from flask_restplus import Api

blueprint = Blueprint('api', __name__)
api = Api(blueprint)
# ...

使用蓝图将允许您在应用程序中的任何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)

2
谢谢。Blueprint Apis:这是将Api链接到一个蓝图的示例,但我希望能够将Api链接到多个蓝图。 - dacoda
1
你可以为每个蓝图执行相同的操作。只需为每个蓝图调用 Api(blueprint) 并在应用程序中注册它们即可。 - Robbe
非常感谢,我会使用命名空间,这是最适合我的目的。 :) - dacoda
1
嗨@dacoda,如果这个答案对你有帮助,你能否将其标记为已接受,以便其他用户清楚地知道它有效吗? - Robbe
1
使用命名空间与蓝图相比有什么优势? - Teharez
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接