ModuleNotFoundError в Connexion - PullRequest
       26

ModuleNotFoundError в Connexion

2 голосов
/ 08 апреля 2019

У меня есть спецификация OpenAPI 3.0 , и я хочу использовать ее с Connexion для запуска службы 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

Однако, когда я запускаю его с помощью Connexion CLI , я вижу 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? Где должен находиться модуль относительно рабочего каталога?

1 Ответ

0 голосов
/ 09 апреля 2019

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

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

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

...