连接中的ModuleNotFoundError

卡斯滕

我有一个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模块?相对于工作目录,模块应驻留在哪里?

凯文·马丁斯

我无法重现您的问题,但我相信是由于PYTHONPATH导致的。

尝试执行:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章