用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/oimiragieo/agent-studio --skill python-backend-expert命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
Agent frontmatter enhancements — disallowedTools, mcpServers scoping, fork_eligible field
Context management — pre-compact persistence, threshold alignment, microcompact/circuit breaker detection
Hook enhancements — updatedInput for bash safety prefixes, suppressOutput for verbose blocks, denial-based routing feedback
正在显示 SKILL.md
| name | python-backend-expert |
| description | Python backend expert including Django, FastAPI, Flask, SQLAlchemy, and async patterns |
| version | 1.1.0 |
| model | sonnet |
| invoked_by | both |
| user_invocable | true |
| tools | ["Read","Write","Edit","Bash","Grep","Glob"] |
| consolidated_from | 1 skills |
| best_practices | ["Follow domain-specific conventions","Apply patterns consistently","Prioritize type safety and testing"] |
| error_handling | graceful |
| streaming | supported |
| verified | true |
| lastVerifiedAt | "2026-02-22T00:00:00.000Z" |
| source | builtin |
| trust_score | 100 |
| provenance_sha | 817cdb85fba53c4a |
When reviewing or writing code, apply these guidelines:
When reviewing or writing code, apply these guidelines:
When reviewing or writing code, apply these guidelines:
When reviewing or writing code, apply these guidelines:
When reviewing or writing code, apply these guidelines:
When reviewing or writing code, apply these guidelines:
When reviewing or writing code, apply these guidelines:
When reviewing or writing code, apply these guidelines:
When reviewing or writing code, apply these guidelines:
When reviewing or writing code, apply these guidelines:
Example usage: ``` User: "Review this code for python-backend best practices" Agent: [Analyzes code against consolidated guidelines and provides specific feedback] ```When reviewing or writing code, apply these guidelines:
db_default on model fields (e.g., db_default=Now()) instead of Python-side defaults where the database should own the valueModelAdmin.show_facets) to get counts alongside filter optionsasync-native queryset methods — prefer await qs.acount(), await qs.afirst(), async for obj in qs in async viewsMIDDLEWARE list; async-capable middleware is preferred for high-throughput ASGI deploymentsLoginRequiredMiddleware (Django 5.1+) instead of decorating every view when all views require authenticationGeneratedField for database-generated columns (computed from other columns at the DB level)When reviewing or writing code, apply these guidelines:
Use the lifespan context manager (not deprecated @app.on_event) for startup/shutdown resource management:
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)
Use Pydantic v2 models for all request/response schemas; Pydantic v2 is the default in FastAPI 0.100+. Use model_config = ConfigDict(...) instead of the inner class Config
Use pydantic-settings (BaseSettings) with lru_cache for config management:
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()
Scope dependencies correctly: per-request (DB sessions, auth), router-level (audit logging, namespace caches), application lifespan (Kafka producers, feature flag SDKs, tracing exporters)
Use Annotated type hints with Depends for cleaner dependency signatures:
from typing import Annotated
from fastapi import Depends
DbSession = Annotated[AsyncSession, Depends(get_db)]
CurrentUser = Annotated[User, Depends(get_current_user)]
Structure projects by domain: routers/, services/, repositories/, schemas/, models/ — avoid flat single-file apps beyond prototypes
Prefer async def path operations for I/O-bound routes; use def (sync) only for CPU-bound work that should run in a thread pool
Use APIRouter with prefix, tags, and dependencies to group related routes and apply shared middleware
When reviewing or writing code, apply these guidelines:
Use create_async_engine + async_sessionmaker (not the deprecated AsyncSession factory directly); create one engine per service at application startup
Use the new Mapped + mapped_column declarative style (SQLAlchemy 2.0+) instead of the legacy Column style:
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)
Provide the DB session via FastAPI dependency injection using async with session scope:
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
Use select() (not the legacy session.query()) for all queries in SQLAlchemy 2.0+
Use selectinload / joinedload explicitly to avoid implicit lazy-load I/O in async contexts (lazy loading raises MissingGreenlet in async)
For upserts, use insert().on_conflict_do_update() (PostgreSQL) or the dialect-specific equivalent rather than separate select + update round trips
Use connection pool sizing appropriate for async: async drivers (asyncpg, aiomysql) need smaller pools than sync drivers; pool_size=5, max_overflow=10 is a safe default for moderate load
When reviewing or writing code, apply these guidelines:
python3.13t (free-threaded build). Avoid assuming GIL protection for shared mutable state in new code targeting 3.13+; use explicit locks or thread-safe data structures. Do not enable free-threaded mode in production without thorough testing of all C extensionsPYTHON_JIT=1. Provides measurable speedups for tight loops and numeric code. No code changes needed; just be aware it exists for performance-sensitive servicest"..." string literals that defer interpolation, useful for safe SQL/HTML construction without injection risk. Prefer T-strings over f-strings when building dynamic queries or HTML fragmentsfrom __future__ import annotations needed). This resolves forward-reference issues in type hints at zero runtime costinterpreters stdlib module enables true parallelism via subinterpreters without disabling the GIL. Useful for CPU-bound workloads that previously required multiprocessingpyproject.toml (not setup.py / requirements.txt alone) for all new projects; use uv or pip with pyproject.toml for reproducible dependency managementpyproject.toml requires-python fieldThis expert skill consolidates 1 individual skills:
lifespan context manager for FastAPI startup/shutdown resource management — @app.on_event is deprecated and will be removed in a future release.session.query() in SQLAlchemy 2.0+ — use select() with the 2.0-style API; legacy query API will be removed.async def with awaitable drivers or run_in_executor for blocking operations to avoid event loop starvation.| Anti-Pattern | Why It Fails | Correct Approach |
|---|---|---|
Using @app.on_event for startup/shutdown | Deprecated in FastAPI; will break on version upgrade | Use @asynccontextmanager with lifespan parameter |
Using session.query() in SQLAlchemy 2.0+ | Legacy query API is deprecated and will be removed | Use select() statements with session.execute() |
Building SQL strings with f-strings or % formatting | SQL injection vulnerability; critical security flaw | Use parameterized queries via ORM or text() with bound params |
Calling blocking I/O directly in async def routes | Blocks the entire event loop; causes cascading latency | Use awaitable async drivers; loop.run_in_executor() for sync code |
| Putting business logic in FastAPI path functions | Couples routing to logic; makes unit testing impossible | Extract logic to service/repository layer; inject via Depends() |
Before starting:
cat .claude/context/memory/learnings.md
After completing: Record any new patterns or exceptions discovered.
ASSUME INTERRUPTION: Your context may reset. If it's not in memory, it didn't happen.