上文我们介绍了简单的FastAPI示例程序,通过发送API请求可以获得一个响应
文章在这里:后端FastAPI—分析示例程序-CSDN博客
之前的API响应是直接返回字典形式的数据,但是当后端处理逻辑比较复杂是,这种方式就不太适用了,最好是用函数调用的方式返回数据,具体怎么做呢?有以下几种形式:
方法一:简单的函数封装
你可以创建一个返回字典的普通 Python 函数,然后在你的 FastAPI 路由中使用这个函数。
from fastapi import FastAPI
app = FastAPI()
def create_wxr_ai_response():
return {"message": "hello wxrai"}
@app.get("/wxr/ai")
async def say_hello_kao():
return create_wxr_ai_response()
在这个例子中,create_wxr_ai_response()
函数负责创建返回的字典。你的 /wxr/ai
路由现在直接调用这个函数并返回其结果。
如何测试: 和之前一样,启动你的 FastAPI 应用并访问 http://127.0.0.1:8000/wxr/ai
,你应该会看到 {"message": "hello wxrai"}
。
方法二:返回 Pydantic 模型 (推荐)
对于更复杂的数据结构和更好的类型校验,推荐使用 Pydantic 模型来定义你的 API 响应。
首先,你需要安装 pydantic
:
pip install pydantic
然后,你可以创建一个 Pydantic 模型来表示你的响应:
from fastapi import FastAPI
from pydantic import BaseModel
class WxrAiResponse(BaseModel):
message: str
app = FastAPI()
def get_wxr_ai_response() -> WxrAiResponse:
return WxrAiResponse(message="hello wxrai")
@app.get("/wxr/ai", response_model=WxrAiResponse)
async def say_hello_kao():
return get_wxr_ai_response()
在这个例子中:
WxrAiResponse
是一个 Pydantic 模型,它定义了响应的结构,包含一个名为message
的字符串字段。get_wxr_ai_response()
函数创建并返回一个WxrAiResponse
实例。- 在
@app.get("/wxr/ai", response_model=WxrAiResponse)
中,response_model=WxrAiResponse
告诉 FastAPI 这个端点应该返回符合WxrAiResponse
模型的数据。FastAPI 会自动进行响应的序列化和文档生成。 - 注意:
WxrAiResponse
是一种 类型提示 (Type Hint),用于指示函数get_wxr_ai_response()
预期返回的值的类型。让我们分解一下:def get_wxr_ai_response():
: 这部分定义了一个名为get_wxr_ai_response
的函数,它不接受任何参数;-> WxrAiResponse
: 这部分是类型提示。它告诉开发者和类型检查器(例如 MyPy)这个函数应该返回一个WxrAiResponse
类型的对象。
方法三:使用类方法 (如果你的逻辑更复杂)
如果你的响应生成逻辑比较复杂,并且可能涉及到一些内部状态或方法,你可以考虑使用一个类来封装。
from fastapi import FastAPI
app = FastAPI()
class WxrAiResponder:
def __init__(self, greeting="hello"):
self.greeting = greeting
def generate_response(self, name="wxrai"):
return {"message": f"{self.greeting} {name}"}
responder = WxrAiResponder()
@app.get("/wxr/ai")
async def say_hello_kao():
return responder.generate_response()
@app.get("/wxr/greet/{name}")
async def say_personalized_kao(name: str):
return responder.generate_response(name=name)
理解 WxrAiResponder
类:
-
class WxrAiResponder:
: 我们定义了一个名为WxrAiResponder
的类。这个类的作用是封装生成特定格式的 AI 响应的逻辑。 -
def __init__(self, greeting="hello"):
: 这是类的构造函数。- 当创建一个
WxrAiResponder
的实例时(例如responder = WxrAiResponder()
),这个方法会被自动调用。 - 它接收一个可选的参数
greeting
,默认值是"hello"
。 self.greeting = greeting
将传入的greeting
值存储到对象的内部状态中,通过self.greeting
可以在这个类的其他方法中访问。
- 当创建一个
-
def generate_response(self, name="wxrai"):
: 这是类的一个方法,用于生成实际的响应数据。- 它接收一个可选的参数
name
,默认值是"wxrai"
。 return {"message": f"{self.greeting} {name}"}
使用 f-string 格式化一个字典,字典中包含一个键为"message"
,值为self.greeting
的值和传入的name
值组合而成的字符串。
- 它接收一个可选的参数
理解 responder
实例:
responder = WxrAiResponder()
: 在这里,我们创建了WxrAiResponder
类的一个实例,并将其赋值给变量responder
。- 由于在创建实例时没有传递
greeting
参数,所以responder
对象的self.greeting
内部状态将被设置为默认值"hello"
。
理解 /wxr/ai
路由:
@app.get("/wxr/ai")
: 这是一个处理 HTTP GET 请求到/wxr/ai
路径的路由。async def say_hello_kao():
: 这是处理该路由的异步函数。return responder.generate_response()
: 在这个函数中,我们调用了responder
实例的generate_response()
方法。- 由于在调用
generate_response()
时没有传递name
参数,它将使用默认值"wxrai"
。 - 因此,
responder.generate_response()
将返回{"message": "hello wxrai"}
。 - FastAPI 会将这个返回的字典自动转换为 JSON 响应发送给客户端。
- 由于在调用
理解 /wxr/greet/{name}
路由:
@app.get("/wxr/greet/{name}")
: 这是一个处理 HTTP GET 请求到/wxr/greet/{name}
路径的路由,其中{name}
是一个路径参数。async def say_personalized_kao(name: str):
: 这是处理该路由的异步函数。它接收一个名为name
的字符串参数,这个参数的值会从 URL 的路径中提取出来。return responder.generate_response(name=name)
: 在这里,我们再次调用了responder
实例的generate_response()
方法,但是这次我们将从路径参数中获取的name
值传递给了generate_response()
方法的name
参数。- 例如,如果请求的 URL 是
http://127.0.0.1:8000/wxr/greet/Alice
,那么say_personalized_kao
函数中的name
变量的值将是"Alice"
。 - 因此,
responder.generate_response(name="Alice")
将返回{"message": "hello Alice"}
(因为self.greeting
仍然是"hello"
,而name
被设置为"Alice"
)。 - FastAPI 会将这个返回的字典转换为 JSON 响应发送给客户端。
- 例如,如果请求的 URL 是
好了 今天的内容就到这里了,下一步 我们来试着构建更复杂的API响应