ModuleNotFoundError в связи

У меня есть спецификация OpenAPI 3.0, и я хочу использовать ее с Connection для запуска службы Python.

Соответствующая часть спецификации API находится здесь:

paths:
  /find:
    post:
      summary: XXX
      description: XXX
      operationId: service.controllers.api.find
      requestBody:
        content:
          application/json:
            schema:
              type: object
              [...]
servers:
  - url: /v2
[...]

Код Python устроен следующим образом:

├── lib
│   └── service
│       ├── controllers
│       │   ├── api.py
│       │   ├── __init__.py
│       ├── __init__.py
│       ├── models
│       │   └── __init__.py
│       └── resources
│           └── openapi
│               └── openapi.yaml

Содержание api.py:

def find():
    return "TEST"

Сама функция find работает как положено:

import service.controllers.api
service.controllers.api.find_skills()

'TEST'

В Python Connexion отлично загружает API:

import connexion
app = connexion.FlaskApp(__name__, 
specification_dir='lib/service/resources/openapi/')
app.add_api('openapi.yaml')                                                                                                

<connexion.apis.flask_api.FlaskApi at 0x7f2241e35b38>

app.run()

Теперь я могу успешно вызвать конечную точку:

$ curl -X POST http://localhost:5000/v2/find

Однако, когда я запускаю его с помощью CLI Connexion, я вижу ModuleNotFoundError:

$ connexion run lib/service/resources/openapi/openapi.yaml

Выход:

ERROR:connexion.apis.abstract:Failed to add operation for POST /v2/find
Traceback (most recent call last):
  File "/home/XXX/anaconda3/envs/find/lib/python3.6/site-packages/connexion/apis/abstract.py", line 206, in add_paths
    self.add_operation(path, method)
[...]
  File "/home/XXX/anaconda3/envs/find/lib/python3.6/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 "service.controllers.api.find"! Import error was "No module named 'service'">

В этом случае, вероятно, что-то не так с путями/именами пакетов. Тем не менее, я также пробовал много вариантов вызова из каталога lib и т. д., но безуспешно. Кроме того, я пытался использовать только имя метода и указать пакет в свойстве x-swagger-router-controller, но тоже не повезло.

Я не смог найти более конкретных подробностей о том, как правильно указать operationId в документации по Connexion, поэтому мне даже не ясно, связано ли это с самим модулем Python, со спецификацией OpenAPI или со способом вызова Connexion.

Есть подсказки, с чего начать копать? Почему клиент командной строки не находит модуль service? Где модуль должен находиться относительно рабочего каталога?


person Carsten    schedule 08.04.2019    source источник
comment
Что говорит ваш документ OpenAPI (swagger.yaml?) для x-openapi-router-controller? Кстати, на практике JSON работает не так хорошо, как YAML.   -  person Zhanwen Chen    schedule 28.01.2020


Ответы (1)


Я не смог воспроизвести вашу проблему, но я считаю, что это происходит из-за PYTHONPATH.

Попробуйте выполнить:

PYTHONPATH=. connexion run lib/service/resources/openapi/openapi.yaml

person Kevin Martins    schedule 09.04.2019