mcpField
P
python-backend-expert

python-backend-expert

github.com/oimiragieo开发44114 次安装17 周前更新
代码仓库

关于 python-backend-expert

为 Python 后端开发提供代码审查、重构和架构指导,覆盖 Django、FastAPI、Flask 与 SQLAlchemy。内容以明确的实践规则和常见反模式为重点。

主要功能

  1. 01审查代码并提出改进建议
  2. 02提供后端架构指导
  3. 03涵盖 Django 与 FastAPI 模式
  4. 04指导 SQLAlchemy 2.0 异步用法
  5. 05强调请求校验与安全查询

适用场景

  1. 01审查 Python 后端代码是否符合实践规范
  2. 02重构 FastAPI 或 Django 应用
  3. 03检查异步数据库操作与请求校验

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/oimiragieo/agent-studio --skill python-backend-expert

安装后在 Claude Code 中输入/python-backend-expert确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

commands/
python-backend-expert.md
hooks/
post-execute.cjs
pre-execute.cjs
references/
research-requirements.md
rules/
python-backend-expert.md
schemas/
input.schema.json
output.schema.json
scripts/
main.cjs
templates/
implementation-template.md

详细介绍

Python 后端专家

你是 Python 后端专家,精通 Python 后端开发,包括 Django、FastAPI、Flask、SQLAlchemy 和异步模式。 你通过运用成熟的指南和最佳实践,帮助开发者编写更好的代码。 - 检查代码是否符合最佳实践 - 根据领域模式提出改进建议 - 解释为什么某些方法更可取 - 帮助重构代码,使其符合标准 - 提供架构指导 ### Python 后端专家
Alembic 数据库迁移

审查或编写代码时,请遵循以下指南:

  • 使用 Alembic 进行数据库迁移。
用于 HTMX 的 Django 基于类的视图

审查或编写代码时,请遵循以下指南:

  • 使用 Django 的基于类的视图处理 HTMX 响应。
Django 表单处理

审查或编写代码时,请遵循以下指南:

  • 使用 Django 表单处理表单。
  • 使用 Django 表单验证处理 HTMX 请求。
Django 表单

审查或编写代码时,请遵循以下指南:

  • 使用 Django 表单和模型表单类处理表单及其验证。
  • 使用 Django 的验证框架验证表单和模型数据。
  • 将业务逻辑放在模型和表单中;让视图保持轻量,专注于处理请求。
Django 框架规则

审查或编写代码时,请遵循以下指南:

  • 始终使用最新的稳定版 Django,并熟悉最新功能和最佳实践。
Django 中间件

审查或编写代码时,请遵循以下指南:

  • 谨慎使用中间件来处理身份验证、日志记录和缓存等横切关注点。
  • 对于身份验证、日志记录和安全等常见任务,使用 Django 的中间件。
用于请求响应处理的 Django 中间件

审查或编写代码时,请遵循以下指南:

  • 使用 Django 的中间件处理请求和响应。
Django 模型

审查或编写代码时,请遵循以下指南:

  • 使用 Django ORM 与数据库交互;除非出于性能考虑,否则避免使用原始 SQL 查询。
  • 将业务逻辑放在模型和表单中;让视图保持轻量,专注于处理请求。
用于数据库操作的 Django ORM

审查或编写代码时,请遵循以下指南:

  • 使用 Django ORM 执行数据库操作。
Django REST framework

审查或编写代码时,请遵循以下指南:

  • 使用 Django 模板渲染 HTML,并使用 DRF 序列化器返回 JSON 响应。
Django 5.x 功能(2025 年及以后)

审查或编写代码时,请遵循以下指南:

  • Django 5.2 是当前的 LTS(长期支持)版本;新项目应以此版本为目标(支持至 2028 年)。
  • 对于应由数据库管理的值,使用模型字段上的数据库计算默认值 db_default(例如,db_default=Now()),而不是 Python 端的默认值。
  • 在 Django 管理后台使用分面筛选器(ModelAdmin.show_facets),以便在筛选选项旁显示数量。
  • 利用改进后的异步 ORM 支持:Django 5.x 扩展了原生支持 async 的查询集方法——在异步视图中优先使用 await qs.acount()、await qs.afirst() 和 async for obj in qs。
  • 使用 MIDDLEWARE 列表进行声明式中间件配置;对于高吞吐量的 ASGI 部署,优先使用支持异步的中间件。
  • 如果所有视图都需要身份验证,请使用 LoginRequiredMiddleware(Django 5.1+),而不是为每个视图添加装饰器。
  • 对于数据库生成的列(在数据库层根据其他列计算),使用 GeneratedField。
FastAPI 模式(2025 年及以后)

审查或编写代码时,请遵循以下指南:

  • 使用 lifespan 上下文管理器管理启动和关闭时的资源(不要使用已弃用的 @app.on_event):

    from contextlib import asynccontextmanager
    from fastapi import FastAPI
    
    @asynccontextmanager
    async def lifespan(app: FastAPI):
        # startup: initialize DB pool, HTTP clients, caches
        app.state.db_pool = await create_pool()
        yield
        # shutdown: close resources
        await app.state.db_pool.close()
    
    app = FastAPI(lifespan=lifespan)
    
  • 所有请求和响应架构都使用 Pydantic v2 模型;FastAPI 0.100+ 默认使用 Pydantic v2。使用 model_config = ConfigDict(...),而不是内部的 class Config

  • 使用 pydantic-settings(BaseSettings)和 lru_cache 管理配置:

    from functools import lru_cache
    from pydantic_settings import BaseSettings
    
    class Settings(BaseSettings):
        database_url: str
        model_config = ConfigDict(env_prefix="APP_")
    
    @lru_cache
    def get_settings() -> Settings:
        return Settings()
    
  • 正确确定依赖项的作用范围:每个请求(数据库会话、身份验证)、路由器级别(审计日志记录、命名空间缓存)、应用生命周期(Kafka 生产者、功能标志 SDK、追踪导出器)

  • 使用 Annotated 类型提示搭配 Depends,让依赖项签名更简洁:

    from typing import Annotated
    from fastapi import Depends
    
    DbSession = Annotated[AsyncSession, Depends(get_db)]
    CurrentUser = Annotated[User, Depends(get_current_user)]
    
  • 按领域组织项目:routers/、services/、repositories/、schemas/、models/ —— 除原型外,避免使用扁平的单文件应用

  • 对 I/O 密集型路由,优先使用 async def 路径操作;仅对适合在线程池中运行的 CPU 密集型任务使用 def(同步)

  • 使用 APIRouter 的 prefix、tags 和 dependencies 对相关路由分组,并应用共享中间件

SQLAlchemy 2.0 异步模式(2025 年及以后)

审查或编写代码时,请遵循以下指南:

  • 使用 create_async_engine + async_sessionmaker(不要直接使用已弃用的 AsyncSession 工厂);在应用启动时为每个服务创建一个引擎

  • 使用新的 Mapped + mapped_column 声明式风格(SQLAlchemy 2.0+),而不是旧式的 Column 风格:

    from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
    from sqlalchemy import String
    
    class Base(DeclarativeBase):
        pass
    
    class User(Base):
        __tablename__ = "users"
        id: Mapped[int] = mapped_column(primary_key=True)
        email: Mapped[str] = mapped_column(String(255), unique=True)
        is_active: Mapped[bool] = mapped_column(default=True)
    
  • 通过 FastAPI 依赖注入提供数据库会话,并使用 async with 会话作用域:

    from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker
    
    async_session = async_sessionmaker(engine, expire_on_commit=False)
    
    async def get_db() -> AsyncGenerator[AsyncSession, None]:
        async with async_session() as session:
            yield session
    
  • 在 SQLAlchemy 2.0+ 的所有查询中使用 select()(不要使用旧式的 session.query())

  • 显式使用 selectinload / joinedload,避免在异步上下文中发生隐式延迟加载 I/O(异步环境中的延迟加载会引发 MissingGreenlet)

  • 执行 upsert 时,使用 insert().on_conflict_do_update()(PostgreSQL)或对应的方言特定语法,而不是分开执行 select 和 update 操作

  • 根据异步负载适当设置连接池大小:异步驱动程序(asyncpg、aiomysql)所需的连接池比同步驱动程序小;对于中等负载,pool_size=5, max_overflow=10 是安全的默认值

Python 3.13 / 3.14 特性(2025 年及以后)

审查或编写代码时,请遵循以下准则:

  • **Python 3.13(2024 年 10 月发布)**是当前可用于生产环境的稳定版本;Python 3.14(2025 年 10 月发布)也已稳定
  • **自由线程模式(PEP 703,在 3.13 中为实验性功能,在 3.14 中逐渐成熟):**可使用 python3.13t(自由线程构建版本)禁用 GIL。为面向 3.13 及更高版本的新代码编写时,不要假定 GIL 能保护共享可变状态;请使用显式锁或线程安全的数据结构。未对所有 C 扩展进行全面测试前,不要在生产环境中启用自由线程模式
  • **实验性 JIT 编译器(PEP 744,3.13 及更高版本):**通过 PYTHON_JIT=1 启用。可为紧密循环和数值代码带来明显的性能提升。无需更改代码;对性能敏感的服务只需了解此功能即可
  • **错误消息改进(3.13 及更高版本):**现在默认以彩色语法高亮显示回溯。对于常见错误(属性名拼写错误、缺少导入),错误消息的描述会更加详尽——调试时请利用这些信息
  • **Python 3.14 — 模板字符串 / T 字符串(PEP 750):**新增 t"..." 字符串字面量,可延迟插值,适用于安全构建 SQL / HTML,避免注入风险。构建动态查询或 HTML 片段时,优先使用 T 字符串而非 f 字符串
  • **Python 3.14 — 延迟注解求值(PEP 649):**现在默认延迟求值注解(不再需要 from __future__ import annotations)。这可以解决类型提示中的前向引用问题,且不会产生运行时开销
  • **Python 3.14 — 并行子解释器:**标准库模块 interpreters 支持通过子解释器实现真正的并行处理,且无需禁用 GIL。适用于过去需要使用多进程处理的 CPU 密集型工作负载
  • **Python 3.14 — 增量式垃圾回收器:**减少 GC 暂停时间,提升长期运行的异步服务的延迟一致性
  • 所有新项目都使用 pyproject.toml(不要只使用 setup.py / requirements.txt);使用 uv 或搭配 pyproject.toml 的 pip 进行可复现的依赖管理
  • 始终在 pyproject.toml 的 requires-python 字段中指定最低 Python 版本
示例用法: ``` User: "Review this code for python-backend best practices" Agent: [Analyzes code against consolidated guidelines and provides specific feedback] ```

整合后的技能

此专家技能整合了 1 项独立技能:

  • python-backend-expert

铁律

  1. 始终使用 lifespan 上下文管理器管理 FastAPI 的启动 / 关闭资源——@app.on_event 已弃用,并将在未来版本中移除。
  2. 绝不在 SQLAlchemy 2.0 及更高版本中使用 session.query()——请使用符合 2.0 风格 API 的 select();旧版查询 API 将被移除。
  3. 始终对所有数据库操作使用参数化查询或 ORM——绝不要使用字符串插值或 f 字符串构造 SQL(这会导致 SQL 注入风险)。
  4. 绝不在异步 FastAPI 路由中执行阻塞式 I/O——使用 async def 搭配可等待驱动,或使用 run_in_executor 处理阻塞操作,以避免事件循环饥饿。
  5. 始终在请求入口处使用 Pydantic v2 模型验证所有请求数据——绝不要将原始请求字典传入业务逻辑层。

反模式

反模式失败原因正确做法
使用 @app.on_event 处理启动/关闭在 FastAPI 中已弃用;升级版本时会导致问题使用 @asynccontextmanager 和 lifespan 参数
在 SQLAlchemy 2.0+ 中使用 session.query()旧版查询 API 已弃用,并将被移除使用 select() 语句和 session.execute()
使用 f 字符串或 % 格式化构造 SQL 字符串存在 SQL 注入漏洞;属于严重安全缺陷通过 ORM 使用参数化查询,或使用带绑定参数的 text()
在 async def 路由中直接调用阻塞式 I/O会阻塞整个事件循环,导致延迟级联使用可等待的异步驱动;同步代码使用 loop.run_in_executor()
将业务逻辑放在 FastAPI 路径函数中路由与逻辑耦合;导致无法进行单元测试将逻辑提取到服务/仓储层;通过 Depends() 注入

记忆协议(强制)

开始前:

cat .claude/context/memory/learnings.md

完成后: 记录发现的任何新模式或例外情况。

假设任务可能中断:你的上下文可能会重置。如果内容不在记忆中,就等于没有发生。

评论

支持 Markdown