ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Python全栈开发实战:FastAPI+SQLite3+Requests构建API服务

Python全栈开发实战:FastAPI+SQLite3+Requests构建API服务 1. 项目概述Python全栈开发入门实战刚接触Python后端开发时最让人头疼的就是不知道如何把各个组件串联起来。这个教程将用最精简的技术栈FastAPI SQLite3 Requests带你快速搭建一个完整的API服务并实现从数据库操作到接口调用的闭环。选择这三个组件的原因很简单FastAPI是目前Python领域性能最好的Web框架之一SQLite3是Python内置的零配置数据库而Requests则是HTTP请求的黄金标准库。它们组合起来既能满足学习需求又足够轻量不会给新手造成环境配置负担。整个项目会分为三个核心阶段首先用SQLite3完成数据持久化接着通过FastAPI暴露RESTful接口最后用Requests测试这些接口。这种数据库→接口→调用的完整链路正是实际工作中最常见的开发流程。我特别建议Python新手按照这个顺序练习因为理解数据如何在不同层级间流动比单纯记忆语法重要得多。2. 环境配置与工具准备2.1 基础环境安装虽然Python自带SQLite3但我们仍需要安装其他依赖。推荐使用虚拟环境隔离项目这是Python开发的最佳实践python -m venv venv # 创建虚拟环境 source venv/bin/activate # 激活环境(Linux/Mac) venv\Scripts\activate # 激活环境(Windows) pip install fastapi uvicorn requests这里有个新手常踩的坑uvicorn是作为独立包安装的虽然FastAPI文档经常提到它但并不会自动安装。我建议同时安装标准版和带额外性能优化的版本pip install uvicorn[standard]2.2 开发工具选择VS Code加上Python插件就是绝佳的组合。特别提醒打开这两个设置在settings.json中添加python.linting.pylintEnabled: true安装SQLite插件方便直接查看数据库内容调试配置.vscode/launch.json建议这样写{ version: 0.2.0, configurations: [ { name: FastAPI, type: python, request: launch, module: uvicorn, args: [main:app, --reload], jinja: true } ] }3. SQLite3数据库实战3.1 数据库连接原理SQLite3之所以适合入门是因为它把整个数据库存储在单个文件中不需要像MySQL那样搭建服务。但要注意连接对象的生命周期管理import sqlite3 from contextlib import closing with closing(sqlite3.connect(test.db)) as conn: with conn: # 自动提交事务 with closing(conn.cursor()) as cur: cur.execute(CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, name TEXT))这里用了三层上下文管理器最外层确保连接关闭中间层处理事务提交内层管理游标资源3.2 游标的秘密为什么需要cursor对象而不是直接操作connection这涉及到数据库API的设计哲学隔离性一个连接可以同时存在多个游标各自维护独立的状态安全性防止SQL注入的预处理语句是在游标上执行的性能游标可以批量获取数据避免一次性加载过大结果集实战中的高级技巧# 获取字段名信息 cursor.execute(SELECT * FROM users) col_names [desc[0] for desc in cursor.description] # 批量插入 users [(Alice,), (Bob,)] cursor.executemany(INSERT INTO users(name) VALUES(?), users)4. FastAPI接口开发详解4.1 路由与参数处理FastAPI最强大的特性之一是它的类型提示系统from fastapi import FastAPI, Query from typing import Optional app FastAPI() app.get(/search) async def search( q: str Query(..., min_length2), page: int 1, size: int Query(10, ge1, le100) ): return {q: q, page: page, size: size}这段代码会自动验证q参数必填且长度≥2给page设置默认值1限制size在1-100之间生成交互式API文档4.2 数据库会话管理直接在每个路由中创建连接不是好做法。应该使用依赖注入from fastapi import Depends def get_db(): db sqlite3.connect(test.db) try: yield db finally: db.close() app.post(/users) async def create_user(name: str, db: sqlite3.Connection Depends(get_db)): db.execute(INSERT INTO users(name) VALUES(?), (name,)) db.commit() return {id: db.execute(SELECT last_insert_rowid()).fetchone()[0]}5. Requests测试技巧5.1 会话保持与超时设置新手常犯的错误是每次请求都新建连接# 错误示范 requests.get(url) requests.post(url) # 两次完全独立的请求 # 正确做法 with requests.Session() as s: s.get(url) s.post(url) # 保持会话状态重要参数设置建议response requests.get( url, timeout(3.05, 27), # 连接超时3.05秒读取超时27秒 headers{User-Agent: MyApp/1.0} )5.2 处理429 Too Many Requests当遇到429错误时应该实现指数退避重试from time import sleep from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry retry_strategy Retry( total3, backoff_factor1, status_forcelist[429, 500, 502, 503, 504] ) adapter HTTPAdapter(max_retriesretry_strategy) with requests.Session() as s: s.mount(https://, adapter) s.mount(http://, adapter) response s.get(url)6. 完整项目架构6.1 分层设计建议即使是小项目也应该有清晰的结构project/ ├── main.py # FastAPI应用入口 ├── database.py # 数据库连接与模型 ├── routers/ # 路由模块 │ ├── users.py │ └── items.py ├── schemas.py # Pydantic模型 └── tests/ # 测试代码 └── test_api.py6.2 性能优化技巧启用SQLite的WAL模式conn.execute(PRAGMA journal_modeWAL)FastAPI的异步数据库访问app.get(/users/{user_id}) async def read_user(user_id: int): loop asyncio.get_event_loop() def query(): with sqlite3.connect(test.db) as db: return db.execute(SELECT * FROM users WHERE id?, (user_id,)).fetchone() result await loop.run_in_executor(None, query) return result7. 调试与问题排查7.1 常见错误解决方案sqlite3.OperationalError: database is locked解决方案设置更长的超时时间sqlite3.connect(test.db, timeout10)fastapi.exceptions.FastAPIError: Invalid args for response field通常是因为路由函数返回了无效类型建议始终使用Pydantic模型定义响应requests.exceptions.SSLError开发环境可以临时禁用验证生产环境绝对不要requests.get(url, verifyFalse) # 仅限测试7.2 日志配置建议在main.py中添加import logging logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s )对于SQL日志logger logging.getLogger(sqlalchemy.engine) logger.setLevel(logging.INFO)8. 项目扩展方向当这个基础项目跑通后你可以考虑加入用户认证JWT实现分页查询添加单元测试用Docker容器化部署接入更强大的数据库如PostgreSQL记住FastAPI的官方文档https://fastapi.tiangolo.com/是极佳的学习资源特别是其中的教程部分循序渐进非常适合新手。SQLite虽然简单但也能支持相当复杂的应用场景它的官方文档https://sqlite.org/docs.html详细介绍了所有特性。
返回列表