
python之web应用FastAPI篇
1.什么是fastAPI?简单来说就是写接口供前端调用的
2.引用fastAPI
pip install FastAPI
3.引入fastAPI,responses是接口返回值,BaseModel是请求体的数据模型
from fastapi import FastAPI
from fastapi.responses import FileResponse
import uvicorn
from pydantic import BaseModel
4.一个测试接口
from fastapi import FastAPI
import uvicorn
app=FastAPI()
@app.get("/test")
def root():
return {"msg":"text"}
@app.get("/user")
def user():
return [{
"id":1
}]
if __name__=="__main__":
uvicorn.run(app,host="0.0.0.0",port=8900)
项目实战:今天讲的是一个AI汉字问答案例,和上一讲的AI角色对话相似,本质上就是用接口实现文件操作和数组的修改
效果

1.首先得初始化session
def create_session():
return datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
@app.post("/api/sessions")
def createsessions():
session_id=create_session()
session_data={
"current_session":session_id,
"messages":[]
}
with open(f"sessions/sessions{session_id}.json","w",encoding="utf-8") as f:
json.dump(session_data,f,ensure_ascii=False,indent=2)
return ApiResponse(code=200,message="创建会话成功",data=f"sessions{session_id}")
这样在文件夹里面创建了session的json文件,数据结构也就出来了
聊天接口,逻辑是通过当前的sessionID获取到文件夹里面的json文件,然后对messages数组进行append
SYSTEM_PROMPT = """
# 角色定义
你是一个专门玩猜字谜的AI小助手,只进行字谜互动,不闲聊无关内容,全程纯文本交互,不使用表情符号。
## 核心能力
- 出字谜、判对错、给提示
- 记忆已用谜题,确保会话内不重复
- 简洁明快回应
## 出题规则(严格执行!)
1. 开场先友好打招呼,并随机出一道常见、简单、适合大众并必须符合逻辑推理的字谜,禁止使用生僻、低俗、网络烂梗。
2. 题目格式:“谜面”(打一字)。
3. 每次出题必须完全随机,禁止重复使用相同题目,也可以偶尔穿插使用,下面示例中的谜语。
4. 新出题目时, 不要提示, 用户需要提示时, 或者答错时, 再给予合理的提示。
## 判题规则(严格执行!)
1. 用户只回复一个字时,直接视为答案。
2. 答对:立即夸奖并揭晓谜底,格式如“太棒了!就是‘X’字!要不要再来一题?”
3. 答错:告知不对,可给一句简短提示,但不泄露答案。格式如“不对哦,再想想~”
4. 严禁在用户答错后直接公布答案!只有用户说“公布答案”或“不知道”等情况时才公布。
## 互动流程
1. 用户答对:夸奖 + 确认正确 + 询问“要不要再来一题?”
2. 用户答错:告知不对 + 简单提示 + 鼓励继续猜
3. 用户说“提示一下”:给出简短线索,不公布答案
4. 用户说“公布答案”或“不知道”:揭晓谜底并解释 + 询问“要不要再来一题?”
5. 用户说“换一题”“再来一题”:立即更换新字谜
## 回复风格约束
- 语气轻松有趣,但保持简洁
- 全程只围绕字谜,拒绝回答其他问题
- 回复不超过3句话
- **绝对不要在回复中说“这个出过了,我来个新的”或类似表述** — 直接给出新谜语即可
- 判题错误零容忍,不确定谜底时,先回复“我再想想”而不是乱判
## 常见谜语类型及谜底参考示例, 仅仅为参照示例
### 组合类
- 「一加一不是二」= 王
- 「二人不是天」= 夫
- 「十口不是田」= 古
### 包含类
- 「一人在内」= 肉
- 「口里有人」= 囚
- 「门里有口」= 问
- 「田里长草」= 苗
- 「心里有你」= 您
- 「山里有山」= 出
- 「王头上有人」= 全
- 「水上有石」= 泵
### 半取类
- 「半吃半拿」= 哈
- 「半真半假」= 值
- 「半青半紫」= 素
- 「半朋半友」= 有
- 「半推半就」= 扰
- 「半山半水」= 汕
### 象形类
- 「三人又重逢」= 众
- 「一口咬掉牛尾巴」= 告
- 「两座山」= 出
- 「三日又重逢」= 晶
"""
@app.post("/api/chat")
def chat(request:chatRequest):
client = OpenAI(api_key="", base_url="https://api.deepseek.com")
session_path=get_session_file_name1(request.session_id)
print(session_path)
#会话数据
with open(session_path,"r",encoding="utf-8") as f:
print("12334r")
session_data=json.load(f)
print(session_data)
messages=[{"role":"system","content":SYSTEM_PROMPT}]
for message in session_data["messages"]:
messages.append(message)
messages.append({"role":"user","content":request.message})
# response = client.chat.completions.create(
# model="deepseek-chat",
# messages=messages,
# stream=False
# )
response=client.chat.completions.create(
model="deepseek-chat",
messages=messages,
stream=False,
temperature=1.0
)
airesponse=response.choices[0].message.content
messages.append({"role":"assistant","content":airesponse})
session_data["messages"]=messages
print("1233")
with open(session_path,"w",encoding="utf-8") as file:
json.dump(session_data,file,ensure_ascii=False,indent=2)
return ApiResponse(code =200,message="成功",data=airesponse)
获取会话列表,也就是获取session文件夹里面的json文件,将文件名整合成一个列表返回给前端
@app.get("/api/sessions")
def getsession():
sessionfiles=os.listdir("sessions")
session_ids=[file.split(".")[0] for file in sessionfiles]
session_ids.sort(reverse=True)
return ApiResponse(code=200,message="获取成功",data=session_ids)
详情和删除接口,和会话接口大同小异,这里不再赘述
@app.get("/api/sessions/{session_id}")
def getdetail(session_id:str):
print(session_id)
session_path=get_session_file_name1(session_id)
print(session_path)
with open(session_path,"r",encoding="utf-8") as f:
session_data=json.load(f)
print(session_data)
return ApiResponse(code =200,message="成功",data=session_data)
@app.delete("/api/sessions/{session_id}")
def dels(session_id:str):
print(session_id)
session_path=get_session_file_name1(session_id)
if os.path.exists(session_path):
os.remove(session_path)
return ApiResponse(code=200, message="删除会话成功", data=session_path)
下一章:fastAPI项目实战



