python fastapi swaggerUI界面,实现多文件上传时的一次异常场景记录
说是异常记录,其实也是一次与AI Agent的深度交流,解决的是swaggerUI界面某个输入框内容中出现了乱码问题。
异常出现动作
执行了如下py文件
from fastapi import FastAPI, File
import uvicorn
app1 = FastAPI()
@app1.post('/file')
def file_fun(f: list[bytes] = File()):
print(f)
print(type(f))
return f
if __name__ == '__main__':
uvicorn.run('test:app1', host='localhost', port=8000)
切换至swagger界面,就出现了这个情况
一堆奇奇怪怪的乱码出现在了输入框上
试图寻找原因
首先,我并不知道原因出在哪,我也没有对应思路,于是开启了第一次与Agent的对话:
我提示词给到了fastapi的版本信息,描述了单个文件正常但多个文件出现问题的这种现象,Agent给我分析了一下,最终得出的结论是:
swaggerUI版本与fastapi当前版本不兼容,让我指定swaggerUI的版本。于是我指定了。
app1 = FastAPI(
swagger_ui_parameters={
"swagger_js_url": "https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.11.2/swagger-ui-bundle.js",
"swagger_css_url": "https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.11.2/swagger-ui.css",
}
)
通过在线cdn的方式引入了5.11.2版本的swaggerUI。
发现问题没解决。
因为我并没有把截图给到agent,agent此时并不知道出现异常的样子是如何如何的,可能是描述需要更加详细,所以我进一步具体的描述了一遍现象给agent
agent给我讲述了可能出现问题的原理,依旧让我升级swaggerUI的版本。
因为升级了版本没有解决问题,所以我把这个现状告诉了agent,而且我当时怀疑是python-multipart版本的问题,所以我也就这么告诉了它

然而它说是有可能的
所以我按照它的指示,降级了python-multipart的版本,它还让我执行一个curl的命令,我执行了,但是问题依旧存在。
不过我发现agent一直在强调一个点,它一直让我确认"format": “binary” 是否被包裹在 “type”: “array” 里。



于是我按照了上图的验证方法,试图去寻找这个字段
结果真的没有
所以我再次向agent发出了提问

agent说我抓住了关键发现,没有format字段。
agent告诉了我format字段的生成方:fastapi

agent给出了swaggerUI的判断逻辑
它是与format字段息息相关的
agent给了我三个方式去解决:
①:强制添加format
②:自定义openAPISchema覆盖
③:降级fastapi版本
很显然降级fastapi版本是验证问题最快的路径,于是我将fastapi版本降级至0.110.0版本
问题解决!format字段出现!
但是!
没完
我重新升回了fastapi版本至0.128.0,问题依旧不出现!
继续寻找原因

agent给出了可能的原因:
①uvicorn reload导致生成schema的时机错误,这个错误被缓存了。并且给出了这个错误概率的可能性高达80%。
时间线:
②pydantic v2编译缓存污染,概率占15%
③Open API schema懒加载的竞态条件(fastapi修改了schema的生成逻辑),概率占5%
很显然,前两个的可能性极大,fastapi版本不会无缘无故修改schema的生成逻辑。而且前两个出现的问题都是某个组件在执行某个方式的过程中错误的生成逻辑被缓存了。
当然,agent给出了验证方法,让我清除pydantic的缓存,并且以noreload的方式启动uvicorn。
我按照此方法重新启动uvicorn,
乱码问题依旧没出现,因此可能就是原因一,
在pydantic没有完全编译好的情况下生成了schema的生成逻辑。这个逻辑被缓存至内存中。
然而在降级fastapi版本的时候,缓存被清除,就导致了之后每次启动uvicorn,swaggerUI输入框对应的乱码问题都没出现。
更多推荐


所有评论(0)