Swagger-UI 生成 python 服务器由于 'no module named' 错误而未启动

Swagger-UI generated python server not starting due to 'no module named' error

我正在使用 OpenAPI 3.0.1 yaml,由于以下错误,它无法启动 API 网络服务器。我几乎尝试了我所知道的一切,但我在 OpenAPI 方面还是个新手,并且按原样遵循了文档。想知道这里可能有什么问题吗?

这是加载服务器时的错误:

Failed to add operation for GET /v2/catalog
Traceback (most recent call last):
  File "C:\Programs\Python\Python38\lib\site-packages\connexion\apis\abstract.py", line 209, in add_paths
    self.add_operation(path, method)
  File "C:\Programs\Python\Python38\lib\site-packages\connexion\apis\abstract.py", line 162, in add_operation
    operation = make_operation(
  File "C:\Programs\Python\Python38\lib\site-packages\connexion\operations\__init__.py", line 8, in make_operation
    return spec.operation_cls.from_spec(spec, *args, **kwargs)
  File "C:\Programs\Python\Python38\lib\site-packages\connexion\operations\openapi.py", line 128, in from_spec
    return cls(
  File "C:\Programs\Python\Python38\lib\site-packages\connexion\operations\openapi.py", line 75, in __init__
    super(OpenAPIOperation, self).__init__(
  File "C:\Programs\Python\Python38\lib\site-packages\connexion\operations\abstract.py", line 96, in __init__
    self._resolution = resolver.resolve(self)
  File "C:\Programs\Python\Python38\lib\site-packages\connexion\resolver.py", line 40, in resolve
    return Resolution(self.resolve_function_from_operation_id(operation_id), operation_id)
  File "C:\Programs\Python\Python38\lib\site-packages\connexion\resolver.py", line 64, in resolve_function_from_operation_id
    raise ResolverError(msg, sys.exc_info())
connexion.exceptions.ResolverError: <ResolverError: Cannot resolve operationId "catalog.get"! Import error was "No module named 'catalog'">

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Programs\Python\Python38\lib\runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Programs\Python\Python38\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "D:\API\swagger_server\__main__.py", line 25, in <module>
    main()
  File "D:\API\swagger_server\__main__.py", line 18, in main
    app.add_api('D:\API\swagger_server\swagger\swagger.yaml', arguments={'title': 'GPI API Broker'}, pythonic_params=True)
  File "C:\Programs\Python\Python38\lib\site-packages\connexion\apps\flask_app.py", line 57, in add_api
    api = super(FlaskApp, self).add_api(specification, **kwargs)
  File "C:\Programs\Python\Python38\lib\site-packages\connexion\apps\abstract.py", line 141, in add_api
    api = self.api_cls(specification,
  File "C:\Programs\Python\Python38\lib\site-packages\connexion\apis\abstract.py", line 111, in __init__
    self.add_paths()
  File "C:\Programs\Python\Python38\lib\site-packages\connexion\apis\abstract.py", line 216, in add_paths
    self._handle_add_operation_error(path, method, err.exc_info)
  File "C:\Programs\Python\Python38\lib\site-packages\connexion\apis\abstract.py", line 231, in _handle_add_operation_error
    raise value.with_traceback(traceback)
  File "C:\Programs\Python\Python38\lib\site-packages\connexion\resolver.py", line 61, in resolve_function_from_operation_id
    return self.function_resolver(operation_id)
  File "C:\Programs\Python\Python38\lib\site-packages\connexion\utils.py", line 110, in get_function_from_name
    module = importlib.import_module(module_name)
  File "C:\Programs\Python\Python38\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'catalog'

启动命令基本上是:python -m swagger_server

最后,这是我的 YAML 的一部分,其中提到了 operationId:

openapi: 3.0.1
info:
  title: Open Service Broker API
  description: The Open Service Broker API defines an HTTP(S) interface between Platforms
    and Service Brokers.
  contact:
    name: Open Service Broker API
    url: https://www.openservicebrokerapi.org/
    email: open-service-broker-api@googlegroups.com
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0.html
  version: master - might contain changes that are not yet released
externalDocs:
  description: The offical Open Service Broker API specification
  url: https://github.com/openservicebrokerapi/servicebroker/
servers:
- url: http://localhost:80/
- url: https://localhost:80/
security:
- basicAuth: []
paths:
  /v2/catalog:
    get:
      tags:
      - Catalog
      summary: get the catalog of services that the service broker offers
      operationId: 'catalog.get'
      parameters:
      - name: X-Broker-API-Version
        in: header
...

提前谢谢大家!

operationId 必须与您的应用所在的位置有关 运行。

swagger_server
|-- app.py
|-- __init__.py
|-- OpenAPI
|   |-- openapi.yml
|-- models
|   |-- catalog.py

鉴于上述文件夹结构,您在目录 swagger_server 中启动应用程序。因此,app.py 的路径在您的 sys.path 中。相对于此路径,您需要在 openapi.yml:

中指定 operationId
paths:
  /v2/catalog:
    get:
      tags:
      - Catalog
      summary: get the catalog of services that the service broker offers
      operationId: 'models.catalog.get'

文件 catalog.py 必须包含函数 def get(name)。您可以在此处为端点定义 service/handler。它必须包含参数 name 因为您已经在 YAML 文件中指定了参数。