FastAPI接口报错:AttributeError: 'dict' object has no attribute 'encode'
问题解决:FastAPI返回Response时出现AttributeError错误
错误原因
- Response参数类型错误:你直接将字典
data传入Response(),但Response类要求传入字符串或字节流数据。FastAPI会尝试对传入内容调用encode()方法编码成字节,而字典没有encode方法,因此触发AttributeError。 - 请求参数接收错误:
spell_check(word: Dict)这种写法会让FastAPI将word当作URL查询参数处理,但你的请求是通过POST请求体传递JSON数据,这样无法正确获取请求中的word字段。
修正方案
方案1:直接返回字典(推荐)
FastAPI会自动将字典序列化为JSON响应,无需手动使用Response类,这是FastAPI的标准用法:
from fastapi import FastAPI import uvicorn from pydantic import BaseModel app = FastAPI() # 用Pydantic模型定义请求体结构 class WordRequest(BaseModel): word: str @app.post('/spell_checking') def spell_check(request: WordRequest): # 这里可添加拼写检查逻辑,处理request.word data = { 'corrected': 'testing' # 示例修正结果 } return data # 直接返回字典,FastAPI自动转为JSON响应 @app.get('/') def welcome(): return 'Hello World' # 直接返回字符串,FastAPI自动处理 if __name__ == '__main__': uvicorn.run(app, port=8080, host='0.0.0.0')
方案2:手动使用Response类(需自定义响应时用)
如果需要自定义响应头、状态码等细节,要先将字典转为JSON字符串,并指定media_type为application/json:
from fastapi import FastAPI, Response import uvicorn from pydantic import BaseModel import json app = FastAPI() class WordRequest(BaseModel): word: str @app.post('/spell_checking') def spell_check(request: WordRequest): data = { 'corrected': 'testing' } # 将字典转为JSON字符串后传入Response return Response(content=json.dumps(data), media_type='application/json') @app.get('/') def welcome(): return Response(content='Hello World', media_type='text/plain') if __name__ == '__main__': uvicorn.run(app, port=8080, host='0.0.0.0')
关键修正点说明
- 使用Pydantic模型(如
WordRequest)可自动解析和验证POST请求体的JSON数据,确保正确获取word字段。 - 避免直接将字典传入
Response,要么让FastAPI自动处理序列化,要么手动转为JSON字符串后再传入。
内容的提问来源于stack exchange,提问作者sin0x1
相关产品推荐
相关产品推荐

