当前位置: 首页 > 知识库问答 >
问题:

带Flask Restplus、API和多个蓝图的Swager

阎承嗣
2023-03-14

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

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

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

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

我的主要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)

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

再一次:

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

通常情况下,我会使用类似于

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

但这似乎无法通过多个蓝图来实现。

有人能给我演示一下如何用api添加/注册这些蓝图(endpointa_api,endpointb_api和endpointc_api)吗?

共有1个答案

桑坚
2023-03-14

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

  • 使用Flask-ResPlus命名空间
  • 将您的蓝图转换为Flask-ResPlusApis

您可以在文档中阅读两者: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)

蓝图Apis

下面是如何将 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)
 类似资料:
  • 我试图得到一个代理工作与蓝图在OSGi(正在通过Karaf)正确,并通过Gradle构建。 我的蓝图文件(名字已经改变,以保护无辜): 我对此感到非常困惑,因为它在抱怨Camel上下文中的标记。我在其他地方使用了完全相同的语法(只是一个不同的包),没有问题。 最后一个“错误”是: RuntimeException:放弃等待服务(ObjectClass=org.apache.camel.CamelC

  • 什么是蓝图? 一个蓝图定义了视图,模板,静态文件以及可以用于应用程序的其它元素的集合。例如,让我们假设下我们有一个管理面板的蓝图。这个蓝图会定义一些包含像 /admin/login 和 /admin/dashboard 路由的视图。它也可能包含服务于这些路由的模板以及静态文件。接着我们可以使用这个蓝图添加一个管理面板到我们的应用程序中,不论我们的应用程序是什么类型的。 为什么要使用蓝图? 蓝图“杀

  • 当我要求MediaWiki API为每个标题提供图像时,它只返回第一个指定标题的图像。例如,查询: http://en.wikipedia.org/w/api.php?format=jsonfm 返回每个页面的信息,但只返回第一页的图像。为什么啊?

  • 我正在开发一个Android应用程序,它可以管理多个蓝牙LE设备,如扬声器、照明设备和各种传感器。 为了方便用户,这些设备必须“分组”在一起,并且只能通过单个蓝牙连接访问。 在这种情况下,是编程某种定制中介硬件来作为所需的接口,还是有更好的解决方案?

  • 问题内容: 我想知道是否可以使用以不同输入参数开头的相同脚本创建服务。如: 可能吗?那么它将启动为串行模式吗?还是分成两个不同的过程?最好的祝福 问题答案: 如果在你的单位的文件,你只能指定一个ExecStart,但您可以添加尽可能多的,但这些都不是适合长期运行的命令,因为它们是串行执行,一切都开始一个开始下一个杀害前。 如果可以指定多个ExecStart,则它们将以串行方式而不是并行运行。 如果