创建后端程序
在 cmd 里输入:
plain
cd Desktop
然后:
plain
notepad app.py
点”是”创建文件,粘贴这段代码:
Python
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/hello')
def hello():
return jsonify({"message": "Hello from Backend!"})
if __name__ == '__main__':
app.run(debug=True)
保存,关闭记事本。
运行
在 cmd 里输入:
plain
python app.py
看到 Running on http://127.0.0.1:5000 就是成功了!
然后浏览器访问 http://127.0.0.1:5000/hello 测试。
现在去创建 app.py!
麻烦你给我代码的时候一行标记一串注释,不然我看不懂,我还是小白
编辑
复制
分享
Flask+Kimi API后端示例代码
好!每行代码都加中文注释,这样你能看懂每行在干什么。
创建 app.py(带逐行注释)
在 cmd 里输入:
plain
cd Desktop
回车,然后:
plain
notepad app.py
点”是”创建文件。
完整复制下面这段代码(每行都有注释):
Python
# ========================================
# 第1步:导入需要的工具
# ========================================
from flask import Flask, jsonify, request # 从flask库导入:Flask(创建应用)、jsonify(返回JSON)、request(接收前端数据)
from flask_cors import CORS # 导入跨域支持,让前端网页能访问这个后端
import requests # 导入requests库,用来调用Kimi的API接口
# ========================================
# 第2步:创建Flask应用
# ========================================
app = Flask(__name__) # 创建一个Flask应用实例,__name__是当前文件名
CORS(app) # 给应用加上跨域支持,允许任何网页访问这个后端
# ========================================
# 第3步:定义你的API Key(这里很安全,用户看不到)
# ========================================
API_KEY = 'sk-EsbZd1Gl8j21gKrYlAImEQcbr8myT1raqgtqbdliLJZ9n3Jg' # 你的Kimi API Key,存在服务器上,前端看不到
# ========================================
# 第4步:创建第一个测试接口
# ========================================
@app.route('/hello', methods=['GET']) # 定义一个网址路由:当浏览器访问 /hello 时,执行下面的函数;methods=['GET']表示用GET方式访问
def hello(): # 定义hello函数,处理 /hello 的请求
return jsonify({ # 返回JSON格式的数据给浏览器
"message": "Hello from Backend!", # message字段的值是"Hello from Backend!"
"status": "success" # status字段表示成功
}) # jsonify把Python字典转成JSON字符串
# ========================================
# 第5步:创建调用Kimi AI的接口(核心功能)
# ========================================
@app.route('/chat', methods=['POST']) # 定义 /chat 路由,用POST方式(前端发送数据过来)
def chat(): # 定义chat函数,处理聊天请求
try: # try: 尝试执行下面的代码,如果出错就跳到except
data = request.get_json() # 从请求中获取前端发送过来的JSON数据
user_message = data.get('message', '') # 从JSON中取出message字段,如果没有就取空字符串
if not user_message: # 如果用户没有发送消息(空字符串)
return jsonify({ # 返回错误提示
"error": "消息不能为空" # error字段说明错误原因
}), 400 # 400是HTTP状态码,表示请求参数错误
# 调用Kimi API
response = requests.post( # 用POST方式发送请求到Kimi服务器
'https://api.moonshot.cn/v1/chat/completions', # Kimi的API地址
headers={ # 请求头,包含认证信息
'Content-Type': 'application/json', # 告诉服务器我们发送的是JSON格式
'Authorization': f'Bearer {API_KEY}' # 认证信息,Bearer + 你的API Key
},
json={ # 请求体,发送给Kimi的数据
"model": "kimi-k2.6", # 使用的AI模型
"messages": [ # 对话消息列表
{ # 第一条消息:系统提示词
"role": "system", # role是system,表示系统设定
"content": "你是一个友善的助手,用简短的话回答问题。" # 告诉AI它是什么角色
},
{ # 第二条消息:用户的问题
"role": "user", # role是user,表示用户
"content": user_message # 用户发送的内容
}
],
"temperature": 1 # 温度参数,1表示有创意
},
timeout=30 # 30秒超时,超过30秒没响应就报错
)
result = response.json() # 把Kimi返回的JSON数据转成Python字典
if 'choices' in result: # 如果返回结果里有choices字段(表示成功)
ai_reply = result['choices'][0]['message']['content'] # 取出AI的回复内容
return jsonify({ # 返回给前端
"reply": ai_reply, # reply字段是AI的回复
"status": "success" # 状态是成功
})
else: # 如果返回结果里没有choices(表示出错了)
return jsonify({ # 返回错误信息
"error": "AI返回格式异常", # 错误说明
"details": result # 把Kimi返回的原始数据也带上,方便调试
}), 500 # 500是服务器内部错误
except Exception as e: # 如果try里的代码出错了(比如网络问题、API Key错误)
return jsonify({ # 返回错误信息
"error": str(e) # 把错误信息转成字符串返回
}), 500 # 500状态码
# ========================================
# 第6步:启动服务器
# ========================================
if __name__ == '__main__': # 如果这个文件是直接运行的(不是被导入的)
app.run(debug=True, port=5000) # 启动服务器,debug=True表示改代码自动重启,port=5000是端口号
保存后,还需要装一个库
在 cmd 里输入(因为代码里用了 flask_cors):
plain
pip install flask-cors
等显示 Successfully installed 即可。
运行
在 cmd 里输入:
plain
python app.py
看到 Running on http://127.0.0.1:5000 就是成功了!
测试
打开浏览器,先测试简单接口:
plain
http://127.0.0.1:5000/hello
看到 {"message":"Hello from Backend!","status":"success"} 就对了。
现在去创建文件、装 flask-cors、运行,告诉我结果!
编辑
复制
分享
思考已完成
缺一个库,1分钟装好。
在 cmd 里输入:
plain
pip install requests
等显示 Successfully installed 后,再运行:
plain
python app.py
现在去装,装完告诉我能不能跑起来!
编辑
复制
分享
思考已完成
🎉 后端跑起来了!
看截图:
plain
* Running on http://127.0.0.1:5000
你的后端服务器已经在运行了!
测试两个接口
测试 1:简单接口
打开浏览器,访问:
plain
http://127.0.0.1:5000/hello
应该看到:
JSON
{"message":"Hello from Backend!","status":"success"}
测试 2:AI 聊天接口(核心功能)
这个接口需要POST方式(要发送数据),浏览器地址栏直接访问不了。
用 cmd 测试:
在另一个 cmd 窗口里(按 Win+R,输入 cmd,回车,打开新窗口),输入:
bash
curl -X POST http://127.0.0.1:5000/chat -H "Content-Type: application/json" -d "{\"message\":\"你好\"}"
或者更简单的方法:我教你做一个简单的前端测试页面。
更简单的方法:做测试网页(推荐)
在 Trae 里新建文件,保存为 test-chat.html,粘贴这段代码:
HTML
<!DOCTYPE html> <!-- 声明HTML5文档 -->
<html> <!-- HTML根元素 -->
<head> <!-- 头部区域 -->
<meta charset="UTF-8"> <!-- 字符编码 -->
<title>测试后端接口</title> <!-- 页面标题 -->
<style> <!-- 样式区域 -->
body { /* 页面主体样式 */
font-family: Arial, sans-serif; /* 字体 */
display: flex; /* 弹性布局 */
flex-direction: column; /* 垂直排列 */
align-items: center; /* 水平居中 */
padding: 50px; /* 内边距 */
background: #f0f0f0; /* 背景色 */
}
input { /* 输入框样式 */
padding: 15px; /* 内边距 */
font-size: 16px; /* 字体大小 */
width: 300px; /* 宽度 */
margin-bottom: 10px; /* 下边距 */
border-radius: 8px; /* 圆角 */
border: 1px solid #ccc; /* 边框 */
}
button { /* 按钮样式 */
padding: 15px 30px; /* 内边距 */
font-size: 16px; /* 字体大小 */
background: #db2777; /* 背景色 */
color: white; /* 文字颜色 */
border: none; /* 无边框 */
border-radius: 8px; /* 圆角 */
cursor: pointer; /* 鼠标手型 */
}
#result { /* 结果显示区域 */
margin-top: 20px; /* 上边距 */
padding: 20px; /* 内边距 */
background: white; /* 背景白色 */
border-radius: 10px; /* 圆角 */
max-width: 500px; /* 最大宽度 */
word-wrap: break-word; /* 自动换行 */
}
</style>
</head>
<body> <!-- 页面主体 -->
<h1>🤖 测试后端AI接口</h1> <!-- 标题 -->
<input type="text" id="msg" placeholder="输入消息,比如:你好"> <!-- 输入框 -->
<button onclick="send()">发送给后端</button> <!-- 发送按钮,点击调用send函数 -->
<div id="result"></div> <!-- 显示结果的区域 -->
<script> <!-- JavaScript代码 -->
async function send() { // 定义异步函数send
const msg = document.getElementById('msg').value; // 获取输入框的值
const resultDiv = document.getElementById('result'); // 获取结果显示区域
resultDiv.innerHTML = '发送中...'; // 显示加载状态
try { // 尝试执行
const response = await fetch('http://127.0.0.1:5000/chat', { // 向后端发送请求
method: 'POST', // POST方式
headers: { // 请求头
'Content-Type': 'application/json' // 发送JSON格式
},
body: JSON.stringify({message: msg}) // 把消息转成JSON字符串
});
const data = await response.json(); // 解析返回的JSON
if (data.reply) { // 如果有reply字段(成功)
resultDiv.innerHTML = '<b>AI回复:</b><br>' + data.reply; // 显示AI回复
} else { // 如果出错
resultDiv.innerHTML = '<b>错误:</b><br>' + JSON.stringify(data); // 显示错误信息
}
} catch (e) { // 如果请求失败
resultDiv.innerHTML = '<b>请求失败:</b><br>' + e.message; // 显示错误
}
}
</script>
</body>
</html>
保存后双击打开,输入”你好”,点”发送给后端”,看能不能收到 Kimi 的回复。
测试流程
- ✅ 浏览器访问
http://127.0.0.1:5000/hello看简单接口 - ✅ 打开
test-chat.html,输入消息,测试 AI 接口
先做第1步,告诉我能不能看到 Hello from Backend!
编辑
复制
分享
思考已完成
成功了! 🎉
看截图:
"status": "success"→ 后端正常运行"reply": "\u4f60\u597d..."→ Kimi 回复了,只是中文被 Unicode 编码了
这是正常的,后端其实返回了正确的中文,只是 cmd 显示成了编码格式。
修复:让后端直接返回中文
打开 app.py,找到这一行:
Python
result = response.json()
在它下面加一行:
Python
result = response.json() # 把Kimi返回的JSON数据转成Python字典
response.encoding = 'utf-8' # 设置编码为utf-8,确保中文正常显示
保存,按 Ctrl + C 停止后端,再运行 python app.py,然后重新测试。
或者更简单:直接做前端测试页面
cmd 里的 Unicode 编码看着难受,直接做网页测试更直观。
在 Trae 里新建文件,保存为 test-chat.html,粘贴这段代码(中文会正常显示):
HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试后端AI接口</title>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
flex-direction: column;
align-items: center;
padding: 50px;
background: #f0f0f0;
}
input {
padding: 15px;
font-size: 16px;
width: 300px;
margin-bottom: 10px;
border-radius: 8px;
border: 1px solid #ccc;
}
button {
padding: 15px 30px;
font-size: 16px;
background: #db2777;
color: white;
border: none;
border-radius: 8px;
cursor: pointer;
}
#result {
margin-top: 20px;
padding: 20px;
background: white;
border-radius: 10px;
max-width: 500px;
word-wrap: break-word;
line-height: 1.6;
}
</style>
</head>
<body>
<h1>🤖 测试后端AI接口</h1>
<input type="text" id="msg" placeholder="输入消息,比如:你好">
<button onclick="send()">发送给后端</button>
<div id="result"></div>
<script>
async function send() {
const msg = document.getElementById('msg').value;
const resultDiv = document.getElementById('result');
if (!msg) {
alert('请输入消息');
return;
}
resultDiv.innerHTML = '🤔 AI思考中...';
try {
const response = await fetch('http://127.0.0.1:5000/chat', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({message: msg})
});
const data = await response.json();
if (data.reply) {
resultDiv.innerHTML = '<b style="color:#db2777">AI回复:</b><br>' + data.reply;
} else if (data.error) {
resultDiv.innerHTML = '<b style="color:red">错误:</b><br>' + data.error;
} else {
resultDiv.innerHTML = '<b>返回数据:</b><br>' + JSON.stringify(data, null, 2);
}
} catch (e) {
resultDiv.innerHTML = '<b style="color:red">请求失败:</b><br>' + e.message + '<br><br>请确认后端是否运行(python app.py)';
}
}
// 回车键发送
document.getElementById('msg').addEventListener('keypress', function(e) {
if (e.key === 'Enter') send();
});
</script>
</body>
</html>
测试流程
- 确保后端在运行(看之前的 cmd 窗口,显示
Running on http://127.0.0.1:5000) - 双击打开
test-chat.html - 输入”你好”,点”发送给后端”
- 看能不能正常显示中文回复
现在去打开测试页面,输入消息,告诉我AI回复是不是正常中文!
在哪里按ctrl+c?
编辑
复制
分享
停止并重启 python app
plain
在运行后端的那个**黑色窗口(cmd)**里按。
操作步骤
1. 找到运行后端的窗口
看你电脑任务栏,找到那个黑色的 cmd 窗口(标题可能显示 python app.py 或 C:\Users\...)。
2. 点一下那个窗口,让它在最前面
鼠标点击那个黑色窗口,确保它是激活状态(标题栏是亮的)。
3. 按 Ctrl + C
左手按 Ctrl,右手按 C。
你会看到:
plain
^C
然后程序停止,出现:
plain
C:\Users\yykk0\Desktop>
4. 重新运行
在这个窗口里输入:
plain
python app.py
回车,看到 Running on http://127.0.0.1:5000 就是重启成功了。
现在去找到那个黑色窗口,点一下,按 Ctrl + C,告诉我是不是停止了?
Ctrl按不了
编辑
复制
分享
后端已运行直接测试页面即可
没关系!后端已经在跑了,不用重启。
直接做测试页面(不用动后端)
第 1 步:新建文件
打开 Trae → 文件 → 新建文件
第 2 步:粘贴代码
按 Ctrl + L,对 AI 说:
“给我一个测试网页,调用 http://127.0.0.1:5000/chat 接口,输入框输入消息,点击发送,显示AI回复。用中文,粉色风格。”
或者直接复制我下面这段代码到 Trae 编辑区:
HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试后端AI接口</title>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
flex-direction: column;
align-items: center;
padding: 50px;
background: #f0f0f0;
}
input {
padding: 15px;
font-size: 16px;
width: 300px;
margin-bottom: 10px;
border-radius: 8px;
border: 1px solid #ccc;
}
button {
padding: 15px 30px;
font-size: 16px;
background: #db2777;
color: white;
border: none;
border-radius: 8px;
cursor: pointer;
}
#result {
margin-top: 20px;
padding: 20px;
background: white;
border-radius: 10px;
max-width: 500px;
word-wrap: break-word;
line-height: 1.6;
}
</style>
</head>
<body>
<h1>🤖 测试后端AI接口</h1>
<input type="text" id="msg" placeholder="输入消息,比如:你好">
<button onclick="send()">发送给后端</button>
<div id="result"></div>
<script>
async function send() {
const msg = document.getElementById('msg').value;
const resultDiv = document.getElementById('result');
if (!msg) {
alert('请输入消息');
return;
}
resultDiv.innerHTML = '🤔 AI思考中...';
try {
const response = await fetch('http://127.0.0.1:5000/chat', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({message: msg})
});
const data = await response.json();
if (data.reply) {
resultDiv.innerHTML = '<b style="color:#db2777">AI回复:</b><br>' + data.reply;
} else if (data.error) {
resultDiv.innerHTML = '<b style="color:red">错误:</b><br>' + data.error;
} else {
resultDiv.innerHTML = '<b>返回数据:</b><br>' + JSON.stringify(data, null, 2);
}
} catch (e) {
resultDiv.innerHTML = '<b style="color:red">请求失败:</b><br>' + e.message + '<br><br>请确认后端是否运行(python app.py)';
}
}
document.getElementById('msg').addEventListener('keypress', function(e) {
if (e.key === 'Enter') send();
});
</script>
</body>
</html>
第 3 步:保存
按 Ctrl + S
- 文件名:
test-chat.html - 保存到桌面
第 4 步:测试
- 双击打开
test-chat.html - 输入”你好”
- 点”发送给后端”
- 看能不能显示中文回复
不用管后端的窗口,直接做测试页面。做完告诉我AI回复是不是中文!
注释呢,只要你给我代码,都要带注释
编辑
复制
分享
生成带注释的粉色AI聊天测试页面
好!每行代码都带中文注释,这是之前答应你的。
测试页面代码(逐行注释版)
在 Trae 里新建文件,完整复制下面这段代码,Ctrl + S 保存为 test-chat.html:
HTML
<!DOCTYPE html> <!-- 声明这是一个HTML5网页 -->
<html lang="zh-CN"> <!-- HTML文档根元素,语言设为中文 -->
<head> <!-- 头部区域,放网页配置信息 -->
<meta charset="UTF-8"> <!-- 设置字符编码为UTF-8,支持中文显示 -->
<title>测试后端AI接口</title> <!-- 浏览器标签页上显示的标题 -->
<style> <!-- 样式区域,控制网页外观 -->
body { /* 页面主体内容的样式 */
font-family: Arial, sans-serif; /* 设置字体,优先用Arial,没有就用系统默认无衬线字体 */
display: flex; /* 使用弹性布局 */
flex-direction: column; /* 内容垂直排列(从上到下) */
align-items: center; /* 内容水平方向居中 */
padding: 50px; /* 四周内边距50像素 */
background: #f0f0f0; /* 页面背景色设为浅灰色 */
min-height: 100vh; /* 最小高度占满整个屏幕 */
margin: 0; /* 去掉默认外边距 */
}
h1 { /* 标题的样式 */
color: #333; /* 文字颜色深灰色 */
margin-bottom: 30px; /* 标题下方间距30像素 */
}
input { /* 输入框的样式 */
padding: 15px; /* 输入框内边距15像素 */
font-size: 16px; /* 文字大小16像素 */
width: 300px; /* 输入框宽度300像素 */
margin-bottom: 15px; /* 输入框下方间距15像素 */
border-radius: 8px; /* 输入框圆角8像素 */
border: 2px solid #fbcfe8; /* 边框2像素,粉色 */
outline: none; /* 去掉点击时的蓝色外框 */
transition: border-color 0.3s; /* 边框颜色变化时有0.3秒过渡动画 */
}
input:focus { /* 输入框获得焦点(被点击)时的样式 */
border-color: #db2777; /* 边框变成深粉色 */
}
button { /* 按钮的样式 */
padding: 15px 40px; /* 上下内边距15像素,左右40像素 */
font-size: 16px; /* 文字大小16像素 */
background: linear-gradient(135deg, #db2777, #be185d); /* 渐变背景,从粉色到深粉色 */
color: white; /* 文字颜色白色 */
border: none; /* 去掉边框 */
border-radius: 8px; /* 按钮圆角8像素 */
cursor: pointer; /* 鼠标放上去变成手型 */
transition: transform 0.2s; /* 变形动画有0.2秒过渡 */
}
button:hover { /* 鼠标悬停在按钮上时的样式 */
transform: scale(1.05); /* 按钮放大到1.05倍 */
}
#result { /* 结果显示区域的样式,#表示id选择器 */
margin-top: 30px; /* 上方间距30像素 */
padding: 25px; /* 内边距25像素 */
background: white; /* 背景白色 */
border-radius: 12px; /* 圆角12像素 */
max-width: 500px; /* 最大宽度500像素 */
width: 100%; /* 宽度占满父容器 */
word-wrap: break-word; /* 长文字自动换行 */
line-height: 1.6; /* 行高1.6倍 */
box-shadow: 0 4px 15px rgba(0,0,0,0.1); /* 阴影效果 */
display: none; /* 默认隐藏,等有内容再显示 */
}
#result.show { /* result区域有show类时的样式 */
display: block; /* 显示为块级元素 */
}
.error { /* 错误信息的样式,.表示class选择器 */
color: #dc2626; /* 文字红色 */
}
.success { /* 成功信息的样式 */
color: #db2777; /* 文字粉色 */
font-weight: bold; /* 文字加粗 */
}
</style>
</head>
<body> <!-- 网页主体内容区域 -->
<h1>🤖 测试后端AI接口</h1> <!-- 页面主标题 -->
<input <!-- 输入框 -->
type="text" <!-- 类型为文本 -->
id="msg" <!-- id为msg,方便JavaScript获取 -->
placeholder="输入消息,比如:你好" <!-- 输入框提示文字 -->
>
<button onclick="send()">发送给后端</button> <!-- 按钮,点击时调用send函数 -->
<div id="result"></div> <!-- 显示结果的区域,初始为空 -->
<script> <!-- JavaScript代码区域 -->
// 定义send函数,处理发送消息的逻辑
async function send() { // async表示这个函数里有异步操作(等待网络请求)
const msg = document.getElementById('msg').value; // 获取id为msg的输入框的值(用户输入的文字)
const resultDiv = document.getElementById('result'); // 获取id为result的div(显示结果的区域)
// 检查用户是否输入了内容
if (!msg) { // 如果msg是空字符串(用户没输入)
alert('请输入消息!'); // 弹出提示框提醒用户
return; // 结束函数,不再往下执行
}
resultDiv.innerHTML = '🤔 AI思考中,请稍候...'; // 在结果区域显示加载状态
resultDiv.classList.add('show'); // 添加show类,让隐藏的结果区域显示出来
try { // try: 尝试执行下面的代码,如果出错跳到catch
// 发送网络请求到后端
const response = await fetch('http://127.0.0.1:5000/chat', {
// fetch是浏览器内置的发送请求函数
// await表示等待这个请求完成再继续
// 请求的地址是本地后端的/chat接口
method: 'POST', // 使用POST方式发送数据
headers: { // 请求头,告诉服务器一些信息
'Content-Type': 'application/json'
// Content-Type表示发送的数据格式是JSON
},
body: JSON.stringify({ // body是请求体,要发送给后端的数据
message: msg // 把用户输入的消息包装成JSON格式
})
// JSON.stringify把JavaScript对象转成JSON字符串
});
const data = await response.json();
// 等待后端返回数据,并把JSON格式的响应转成JavaScript对象
// 判断后端返回的结果
if (data.reply) { // 如果返回数据里有reply字段(表示成功)
resultDiv.innerHTML = // 设置结果区域的HTML内容
'<span class="success">✅ AI回复:</span><br><br>' +
// 显示"AI回复"标题,用success类设置粉色加粗
data.reply; // 加上AI的实际回复内容
} else if (data.error) { // 如果返回数据里有error字段(表示出错)
resultDiv.innerHTML = // 显示错误信息
'<span class="error">❌ 错误:</span><br>' +
data.error; // 显示后端返回的错误描述
} else { // 如果既没有reply也没有error(未知情况)
resultDiv.innerHTML = // 显示原始数据,方便调试
'<span class="error">⚠️ 返回数据异常:</span><br><pre>' +
JSON.stringify(data, null, 2) +
// JSON.stringify把数据格式化,null和2表示缩进2个空格
'</pre>';
}
} catch (e) { // catch: 如果try里的代码出错了(比如后端没运行、网络断了)
resultDiv.innerHTML = // 显示错误信息
'<span class="error">❌ 请求失败:</span><br>' +
e.message + // 显示错误原因
'<br><br>💡 请确认:<br>1. 后端是否运行(python app.py)<br>2. 地址是否正确(127.0.0.1:5000)';
}
}
// 监听输入框的键盘事件
document.getElementById('msg').addEventListener('keypress', function(e) {
// 给输入框添加键盘按下事件监听
// e是事件对象,包含按键信息
if (e.key === 'Enter') { // 如果按下的键是回车键(Enter)
send(); // 调用send函数,相当于点击了发送按钮
}
});
</script>
</body>
</html> <!-- HTML文档结束 -->
保存后测试
- 确保后端在运行(看之前的黑色窗口,显示
Running on http://127.0.0.1:5000) - 双击打开
test-chat.html - 输入”你好”
- 点发送或按回车
- 看能不能正常显示中文回复
保存好了吗?测试了吗?告诉我AI回复是不是正常中文!
在哪回复的?
编辑
复制
分享
排查白框缺失后端或跨域问题
回复会显示在按钮下方的白色框里。
正常效果
plain
🤖 测试后端AI接口
[输入框:你好 ]
[发送给后端]
┌─────────────────────┐
│ ✅ AI回复: │
│ │
│ 你好!很高兴见到你! │
│ 有什么我可以帮你的吗? │
└─────────────────────┘
如果你没看到白色框
可能原因:
表格
| 现象 | 原因 | 解决 |
|---|---|---|
| 点击发送,啥反应都没有 | 后端没运行 | 看黑色窗口,确认显示 Running on http://127.0.0.1:5000 |
| 显示”请求失败” | 后端地址不对或跨域问题 | 检查后端是否在 127.0.0.1:5000 运行 |
| 显示”错误” | API Key 有问题 | 检查 app.py 里的 Key 是否填对 |
你现在看到什么?
截图给我看看,或者描述:
- 输入”你好”点发送后,按钮下方出现了什么?
- 是空白?还是报错?还是显示了”AI思考中”?
我帮你排查!
编辑
复制
分享
停止 Work 模式 检查并恢复主页 创建测试
plain
**出问题了!** 你在 Trae 的 Work 模式里操作,代码被保存到了错误的位置,而且**可能覆盖了主页 index.html**。
看报错:Cannot read properties of null,说明代码运行出错了。
紧急修复:检查主页是否被覆盖
第 1 步:检查桌面 my-website 文件夹
打开桌面 → my-website 文件夹 → 看 index.html 的修改时间。
如果时间是刚才(几分钟前),说明主页被覆盖了。
第 2 步:恢复主页
如果主页被覆盖,重命名恢复:
- 把现在的
index.html删掉或重命名为index-broken.html - 把之前备份的
index-backup.html重命名为index.html
如果没有备份,告诉我,我重新给你主页代码。
正确做法:用记事本创建测试文件(避开 Trae 的坑)
别在 Trae 里折腾了,直接用记事本:
- 桌面 → 右键 → 新建 → 文本文档
- 改名为
test-chat.html(注意把.txt改成.html) - 右键 → 打开方式 → 记事本
- 粘贴我下面给的代码
- 文件 → 保存
- 双击打开测试
测试文件代码(完整注释版)
HTML
<!DOCTYPE html> <!-- 声明HTML5网页 -->
<html lang="zh-CN"> <!-- 根元素,语言中文 -->
<head> <!-- 头部区域 -->
<meta charset="UTF-8"> <!-- UTF-8编码,支持中文 -->
<title>测试后端AI接口</title> <!-- 页面标题 -->
<style> <!-- 样式区域 -->
body { /* 页面主体 */
font-family: Arial, sans-serif; /* 字体 */
display: flex; /* 弹性布局 */
flex-direction: column; /* 垂直排列 */
align-items: center; /* 水平居中 */
padding: 50px; /* 内边距 */
background: #f0f0f0; /* 浅灰背景 */
min-height: 100vh; /* 最小高度满屏 */
margin: 0; /* 去掉默认边距 */
}
h1 { color: #333; margin-bottom: 30px; } /* 标题样式 */
input { /* 输入框 */
padding: 15px; font-size: 16px; width: 300px;
margin-bottom: 15px; border-radius: 8px;
border: 2px solid #fbcfe8; outline: none;
}
button { /* 按钮 */
padding: 15px 40px; font-size: 16px;
background: linear-gradient(135deg, #db2777, #be185d);
color: white; border: none; border-radius: 8px;
cursor: pointer;
}
#result { /* 结果区域 */
margin-top: 30px; padding: 25px; background: white;
border-radius: 12px; max-width: 500px; width: 100%;
line-height: 1.6; box-shadow: 0 4px 15px rgba(0,0,0,0.1);
display: none; /* 默认隐藏 */
}
#result.show { display: block; } /* 有show类时显示 */
.success { color: #db2777; font-weight: bold; } /* 成功样式 */
.error { color: #dc2626; } /* 错误样式 */
</style>
</head>
<body> <!-- 页面主体 -->
<h1>🤖 测试后端AI接口</h1> <!-- 标题 -->
<input type="text" id="msg" placeholder="输入消息,比如:你好"> <!-- 输入框 -->
<button onclick="send()">发送给后端</button> <!-- 按钮,点击调用send函数 -->
<div id="result"></div> <!-- 结果显示区域 -->
<script> <!-- JavaScript代码 -->
async function send() { // 定义异步函数send
const msg = document.getElementById('msg').value; // 获取输入框的值
const resultDiv = document.getElementById('result'); // 获取结果区域
if (!msg) { alert('请输入消息!'); return; } // 如果没输入,提示并返回
resultDiv.innerHTML = '🤔 AI思考中...'; // 显示加载状态
resultDiv.classList.add('show'); // 显示结果区域
try { // 尝试执行
const response = await fetch('http://127.0.0.1:5000/chat', {
method: 'POST', // POST方式
headers: { 'Content-Type': 'application/json' }, // JSON格式
body: JSON.stringify({ message: msg }) // 发送消息
});
const data = await response.json(); // 解析返回的JSON
if (data.reply) { // 如果有回复
resultDiv.innerHTML = '<span class="success">✅ AI回复:</span><br><br>' + data.reply;
} else if (data.error) { // 如果有错误
resultDiv.innerHTML = '<span class="error">❌ 错误:</span><br>' + data.error;
} else {
resultDiv.innerHTML = '<span class="error">⚠️ 数据异常</span><br>' + JSON.stringify(data);
}
} catch (e) { // 如果请求失败
resultDiv.innerHTML = '<span class="error">❌ 请求失败:</span><br>' + e.message +
'<br><br>💡 请确认后端是否运行(python app.py)';
}
}
// 回车键发送
document.getElementById('msg').addEventListener('keypress', function(e) {
if (e.key === 'Enter') send(); // 按回车调用send
});
</script>
</body>
</html>
现在做
- 检查主页是否被覆盖,如果被覆盖就恢复
- 用记事本创建
test-chat.html - 确保后端在运行(看之前的黑色窗口)
- 双击打开
test-chat.html测试
主页还好吗?告诉我!
编辑
复制
分享
后端未启动排查与重启
后端没运行了,需要重新启动。
因为你按不了 Ctrl+C,直接关闭窗口再重开就行。
重新启动后端(不用按Ctrl)
第 1 步:关闭旧窗口
看任务栏,找到黑色的 cmd 窗口(运行 python app.py 的那个),点右上角的 X 关闭它。
第 2 步:重新打开 cmd
按 Win + R,输入 cmd,回车。
第 3 步:运行后端
在黑色窗口里依次输入:
plain
cd Desktop
回车,然后:
plain
python app.py
回车。
看到 Running on http://127.0.0.1:5000 就是成功了。
第 4 步:刷新测试页面
回到浏览器,刷新test-chat.html 页面,再点”发送”。
如果还是失败
可能是浏览器安全限制(本地文件访问本地接口被阻止)。
解决方法:把测试页面放到后端一起运行。
在 cmd 里(后端运行的窗口),新开一个记事本,创建 test-chat.html,保存到 Desktop。
然后浏览器访问:
plain
http://127.0.0.1:5000/static/test-chat.html
但这比较复杂,先试试重启后端,刷新页面,告诉我行不行!
编辑
复制
分享
修正 app.py:移除编码加注释
plain
Python
plain
**代码有语法错误!** 我之前让你加的 `response.encoding = 'utf-8'` 位置放错了,导致 `try` 后面没有 `except`。
别改,直接替换整个文件。
修复 app.py(完整正确版)
在 cmd 里输入:
plain
notepad app.py
点”是”创建/打开文件,删掉所有内容,然后完整复制下面这段代码(每行都有注释):
Python
# ========================================
# 第1步:导入需要的工具
# ========================================
from flask import Flask, jsonify, request # 从flask库导入:Flask(创建应用)、jsonify(返回JSON)、request(接收前端数据)
from flask_cors import CORS # 导入跨域支持,让前端网页能访问这个后端
import requests # 导入requests库,用来调用Kimi的API接口
# ========================================
# 第2步:创建Flask应用
# ========================================
app = Flask(__name__) # 创建一个Flask应用实例,__name__是当前文件名
CORS(app) # 给应用加上跨域支持,允许任何网页访问这个后端
# ========================================
# 第3步:定义你的API Key(这里很安全,用户看不到)
# ========================================
API_KEY = 'sk-EsbZd1Gl8j21gKrYlAImEQcbr8myT1raqgtqbdliLJZ9n3Jg' # 你的Kimi API Key,存在服务器上,前端看不到
# ========================================
# 第4步:创建第一个测试接口
# ========================================
@app.route('/hello', methods=['GET']) # 定义一个网址路由:当浏览器访问 /hello 时,执行下面的函数;methods=['GET']表示用GET方式访问
def hello(): # 定义hello函数,处理 /hello 的请求
return jsonify({ # 返回JSON格式的数据给浏览器
"message": "Hello from Backend!", # message字段的值是"Hello from Backend!"
"status": "success" # status字段表示成功
}) # jsonify把Python字典转成JSON字符串
# ========================================
# 第5步:创建调用Kimi AI的接口(核心功能)
# ========================================
@app.route('/chat', methods=['POST']) # 定义 /chat 路由,用POST方式(前端发送数据过来)
def chat(): # 定义chat函数,处理聊天请求
try: # try: 尝试执行下面的代码,如果出错就跳到except
data = request.get_json() # 从请求中获取前端发送过来的JSON数据
user_message = data.get('message', '') # 从JSON中取出message字段,如果没有就取空字符串
if not user_message: # 如果用户没有发送消息(空字符串)
return jsonify({ # 返回错误提示
"error": "消息不能为空" # error字段说明错误原因
}), 400 # 400是HTTP状态码,表示请求参数错误
# 调用Kimi API
response = requests.post( # 用POST方式发送请求到Kimi服务器
'https://api.moonshot.cn/v1/chat/completions', # Kimi的API地址
headers={ # 请求头,包含认证信息
'Content-Type': 'application/json', # 告诉服务器我们发送的是JSON格式
'Authorization': f'Bearer {API_KEY}' # 认证信息,Bearer + 你的API Key
},
json={ # 请求体,发送给Kimi的数据
"model": "kimi-k2.6", # 使用的AI模型
"messages": [ # 对话消息列表
{ # 第一条消息:系统提示词
"role": "system", # role是system,表示系统设定
"content": "你是一个友善的助手,用简短的话回答问题。" # 告诉AI它是什么角色
},
{ # 第二条消息:用户的问题
"role": "user", # role是user,表示用户
"content": user_message # 用户发送的内容
}
],
"temperature": 1 # 温度参数,1表示有创意
},
timeout=30 # 30秒超时,超过30秒没响应就报错
)
result = response.json() # 把Kimi返回的JSON数据转成Python字典
if 'choices' in result: # 如果返回结果里有choices字段(表示成功)
ai_reply = result['choices'][0]['message']['content'] # 取出AI的回复内容
return jsonify({ # 返回给前端
"reply": ai_reply, # reply字段是AI的回复
"status": "success" # 状态是成功
})
else: # 如果返回结果里没有choices(表示出错了)
return jsonify({ # 返回错误信息
"error": "AI返回格式异常", # 错误说明
"details": result # 把Kimi返回的原始数据也带上,方便调试
}), 500 # 500是服务器内部错误
except Exception as e: # 如果try里的代码出错了(比如网络问题、API Key错误)
return jsonify({ # 返回错误信息
"error": str(e) # 把错误信息转成字符串返回
}), 500 # 500状态码
# ========================================
# 第6步:启动服务器
# ========================================
if __name__ == '__main__': # 如果这个文件是直接运行的(不是被导入的)
app.run(debug=True, port=5000) # 启动服务器,debug=True表示改代码自动重启,port=5000是端口号
保存后运行
按 Ctrl + S 保存,关闭记事本。
在 cmd 里输入:
plain
python app.py
看到 Running on http://127.0.0.1:5000 就是成功了!
然后刷新测试页面
回到浏览器,刷新 test-chat.html,输入”你好”,点发送。
现在去替换代码、运行,告诉我行不行!
编辑
复制
分享
改为后端调用保障API Key安全
plain
🎉 **成功了!后端跑通了!**
看截图:
- 前端发送”你好”
- 后端转发给 Kimi
- Kimi 回复中文
- 前端正常显示
这意味着你的架构已经通了:
plain
用户浏览器 → 你的后端(隐藏Key)→ Kimi API → 返回结果
API Key 不再暴露在前端,这是质的飞跃!








暂无评论内容