前言
随着ChatGPT的爆发式增长,集成AI能力成为后端开发者必备技能。本文将从零开始,带你使用Flask框架实现一个生产级别的GPT聊天机器人后端服务,涵盖API开发、数据校验、测试、数据库等完整流程。
一、章节概览
本教程分为以下核心模块:
| 模块 | 主要内容 |
|---|---|
| OpenAI API实现第一个聊天接口 | API调用、环境配置 |
| 数据校验 | Flask-wtf请求验证 |
| 规范化响应 | 统一数据格式、错误处理 |
| 单元测试 | PyTest配置与测试用例 |
| 数据库管理 | SQLAlchemy ORM、Flask-Migrate迁移 |
二、实现第一个GPT聊天接口
2.1 环境配置分离
使用 python-dotenv 库将 .env 文件加载到环境变量,实现配置与代码分离:
import os
from dotenv import load_dotenv
load_dotenv() # 加载.env文件
# 获取环境变量
api_key = os.getenv("OPENAI_API_KEY")
2.2 为什么需要请求校验
- 数据完整性:确保数据格式、类型、长度正确
- 安全性:防止SQL注入等安全漏洞
- 用户体验:提供友好的错误提示
2.3 Flask-wtf 安装与使用
pip install flask-wtf
Flask-wtf 基于 wtforms 封装,支持:
- 数据类型:布尔值、日期、文本、时间、浮点数、邮箱、文件等
- 校验规则:必填、长度、邮箱格式、正则、范围、URL等
三、统一响应接口设计
3.1 为什么要统一数据格式
建立前后端接口约定,统一数据格式方便处理。如果不统一,前端需要判断多种可能,效率极低。
3.2 响应格式设计
HTTP状态码统一返回200,通过业务状态码判断成功与否:
{
"code": "success",
"message": "获取AI应用数据成功",
"data": {
"content": "你好!有什么可以帮助你的吗?"
}
}
3.3 分页数据响应格式
{
"code": " "success",
"message": "",
"data": {
"paginator": {
"page_size": 10,
"current_page": 1,
"total_page": 10,
"total_record": 100
},
"list": []
}
}
3.4 业务状态码定义
| 状态码 | 说明 |
|---|---|
| success | 操作成功 |
| fail | 操作失败 |
| not_found | 资源不存在 |
| unauthorized | 未授权 |
| forbidden | 禁止访问 |
| validate_error | 校验错误 |
四、PyTest单元测试
4.1 PyTest简介
PyTest是功能强大的Python测试框架,优势包括:
- 简单易用,学习曲线低
- 支持多种测试样式
- 丰富的插件生态
- 详细的输出信息
4.2 安装
pip install pytest
4.3 测试规则
| 规则 | 说明 |
|---|---|
| 测试文件 | 以 test_ 开头或 _test 结尾 |
| 测试类 | 以 Test 开头,不带 __init__ 方法 |
| 测试函数 | 以 test_ 开头 |
| 断言 | 使用基本 assert |
4.4 fixture设置测试环境
# test/conftest.py
import pytest
from app import app
@pytest.fixture
def client():
app.config["TESTING"] = True
with app.test_client() as client:
yield client
4.5 参数化测试
@pytest.mark.parametrize("query", [None, "你好,你是?"])
def test_completion(self, query, client):
r = client.post("/app/completion", json={"query": query})
assert r.status_code == 200
if query is None:
assert r.json.get("code") == "VALIDATE_ERROR"
else:
assert r.json.get("code") == "SUCCESS"
4.6 pytest.ini配置
[pytest]
cache_dir = tmp/.pytest_cache
addopts = -v -s
python_files = test_*.py *_test.py
python_classes = Test*
python_functions = test_*
五、SQLAlchemy ORM数据库操作
5.1 ORM是什么
ORM (Object-Relational Mapping) 将数据库表映射为类:
- 表 → 类
- 行 → 类实例
- 列 → 属性
5.2 安装
pip install flask-sqlalchemy psycopg2
5.3 核心配置
| 配置项 | 说明 | 示例 |
|---|---|---|
| SQLALCHEMY_DATABASE_URI | 数据库连接地址 | postgresql://root:123456@127.0.0.1:5432/test |
| SQLALCHEMY_ECHO | 打印SQL语句 | True |
| SQLALCHEMY_TRACK_MODIFICATIONS | 追踪变化 | False |
5.4 创建模型
import uuid
from datetime import datetime
from sqlalchemy import Column, UUID, String, DateTime, PrimaryKeyConstraint, Index
from sqlalchemy.dialects.postgresql import JSONB
from internal.extension.database_extension import db
class App(db.Model):
"""AI应用模型"""
__tablename__ = "app"
__table_args__ = (
PrimaryKeyConstraint("id", name="pk_app_id"),
Index("idx_app_account_id", "account_id"),
)
id = Column(UUID, default=uuid.uuid4, nullable=False)
account_id = Column(UUID, nullable=False)
name = Column(String(255), default="", nullable=False)
icon = Column(String(255), default="", nullable=False)
config = Column(JSONB, default={}, nullable=False)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, nullable=False)
created_at = Column(DateTime, default=datetime.now, nullable=False)
5.5 增删改查操作
# 新增
student = Students(name='yy', fullname='yoyo')
db.session.add(student)
db.session.commit()
# 查询
users = User.query.order_by(User.id).all()
user = User.query.filter_by(username='john').first()
# 修改
Student.query.filter_by(name='yy').update({"fullname": "xx"})
db.session.commit()
# 删除
Student.query.filter_by(name='imooc").delete()
db.session.commit()
5.6 自动提交封装
from contextlib import contextmanager
from flask_sqlalchemy import SQLAlchemy as _SQLAlchemy
class SQLAlchemy(_SQLAlchemy):
@contextmanager
def auto_commit(self):
try:
yield
self.session.commit()
except Exception as e:
self.session.rollback()
raise e
# 使用
with db.auto_commit():
student = Student.query.first()
student.name = "imooc"
六、Flask-Migrate数据库迁移
6.1 为什么需要迁移
db.create_all() 无法更新已存在的表结构,需要迁移工具保留数据进行表结构更新。
6.2 安装与初始化
pip install flask-migrate
from flask_migrate import Migrate
migrate = Migrate(app, db, directory="internal/migration")
6.3 常用命令
# 初始化迁移环境
flask --app app.server.app db init
# 生成迁移脚本
flask --app app.server.app db migrate -m "create_table"
# 更新数据库
flask --app app.server.app db upgrade
# 回滚
flask --app app.server.app db downgrade
# 回滚到初始版本
flask --app app.server.app db downgrade base
七、总结
本文从零开始构建了一个生产级别的GPT聊天机器人后端服务,核心要点:
- 环境配置:使用
.env实现配置分离 - 数据校验:Flask-wtf 确保请求安全
- 统一响应:标准化API返回格式
- 单元测试:PyTest 保证代码质量
- ORM操作:SQLAlchemy 简化数据库交互
- 数据库迁移:Flask-Migrate 管理表结构变更
这些技术组合起来,构成了一个完整的AI应用后端架构基础。

2710

被折叠的 条评论
为什么被折叠?



