You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flasgger访问apidocs报AttributeError: 'NoneType'无get属性求助

解决Flasgger AttributeError: 'NoneType' object has no attribute 'get' 报错

看了你的日志和代码,这个问题是Flasgger在解析Swagger文档时,extract_definitions方法碰到了None对象,尝试调用get方法导致的报错。我之前也处理过类似的情况,给你几个具体的排查和解决思路:

1. 先升级Flasgger到稳定版

旧版本的Flasgger对某些Swagger schema结构的解析存在bug,尤其是嵌套响应结构这块。先把Flasgger升到最新稳定版试试:

pip install --upgrade flasgger

2. 修正Swagger文档的响应schema定义

你的API文档里,200响应的嵌套schema可能让Flasgger解析卡壳了。注意到response字段下的dataerror是互斥的,但旧版Flasgger对这种结构的处理不太友好。可以试着调整成更清晰的结构,或者先简化测试:

responses:
  200:
    description: returns the status of deserialization
    schema:
      type: object
      properties:
        status:
          type: string
          description: success / error
        response:
          type: object
          properties:
            data:
              type: string
              description: the data returned by API upon success
            error:
              type: string
              description: the error message returned by API upon failure
          # 明确标注字段可选,帮助Flasgger正确解析
          required: []

也可以先把response的嵌套结构去掉,改成简单的键值对,看看apidocs能不能正常加载,再逐步恢复复杂结构,找到具体的问题点。

3. 调整Flask应用的初始化顺序

你的代码里是先初始化Swagger再定义路由,有些版本的Flasgger需要在所有路由注册完成后再初始化Swagger,不然可能扫描不到完整的文档注释。试试调整顺序:

app = Flask(__name__)
CORS(app)

# 先注册所有路由
@app.route("/deserialize", methods=['POST'])
def handle_deserialization_request():
    # 你的业务代码和Swagger文档...

# 最后初始化Swagger
Swagger(app)

4. 调试定位具体的问题schema

如果上面的方法都没用,可以临时给Flasgger的extract_definitions方法加个调试打印,看看是哪个部分的schema变成了None。找到你Python环境里的flasgger/utils.py文件,修改extract_definitions方法:

def extract_definitions(schema, definitions=None):
    # 添加调试打印
    print("当前处理的schema:", schema)
    print("当前的definitions:", definitions)
    # 原方法的代码...

运行应用后访问apidocs,就能在控制台看到具体是哪个schema片段导致的问题,然后针对性修正你的Swagger文档。

先试试这几个方法,应该能解决这个报错。如果还是不行,可以写个最小的测试应用(只保留基础的Flask+Flasgger配置和简单的API文档),确认基础功能正常后再逐步添加你的业务代码,这样更容易定位问题。

内容的提问来源于stack exchange,提问作者LoveMeow

火山引擎 最新活动