У меня есть спецификация 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
? Где модуль должен находиться относительно рабочего каталога?
x-openapi-router-controller
? Кстати, на практике JSON работает не так хорошо, как YAML. - person Zhanwen Chen   schedule 28.01.2020