@umacloud/knowledge 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/00-governance/governance-capabilities.md +557 -0
- package/00-governance/knowledge-map.md +39 -0
- package/00-governance/maintenance-policy.md +76 -0
- package/00-governance/review-checklist.md +81 -0
- package/README.md +13 -0
- package/ai/01-standards/agent-development-complete.md +691 -0
- package/ai/01-standards/llm-application-complete.md +488 -0
- package/ai/01-standards/mlops-complete.md +798 -0
- package/ai/01-standards/prompt-engineering-complete.md +646 -0
- package/ai/01-standards/rag-architecture-complete.md +649 -0
- package/ai/02-playbooks/llm-evaluation-playbook.md +847 -0
- package/ai/03-checklists/ai-project-checklist.md +215 -0
- package/ai/04-antipatterns/ai-antipatterns.md +661 -0
- package/ai/05-cases/case-rag-production.md +147 -0
- package/ai/06-glossary/ai-glossary.md +162 -0
- package/ai/agent-evaluation-benchmark.md +53 -0
- package/ai/ai-agent-memory-context-management.md +41 -0
- package/ai/ai-cost-capacity-optimization-playbook.md +42 -0
- package/ai/ai-data-security-and-compliance-playbook.md +37 -0
- package/ai/ai-domain-index-and-checklist.md +40 -0
- package/ai/ai-governance-maturity-model.md +50 -0
- package/ai/ai-model-selection-and-routing-strategy.md +47 -0
- package/ai/ai-observability-and-oncall-runbook.md +52 -0
- package/ai/ai-rag-engineering-playbook.md +42 -0
- package/ai/ai-red-team-and-safety-evaluation.md +42 -0
- package/ai/ai-release-readiness-and-rollback-gate.md +42 -0
- package/ai/llm-agent-engineering-deep-dive.md +57 -0
- package/ai/prompt-and-tool-guardrails.md +52 -0
- package/api/01-standards/enterprise-api-standards.md +198 -0
- package/api/01-standards/rest-api-design-guide.md +63 -0
- package/api/02-playbooks/api-pagination-playbook.md +93 -0
- package/api/02-playbooks/graphql-production-playbook.md +176 -0
- package/api/03-checklists/api-review-checklist.md +55 -0
- package/api/04-antipatterns/api-antipatterns.md +112 -0
- package/architecture/01-standards/api-gateway-patterns.md +496 -0
- package/architecture/01-standards/cloud-native-patterns.md +644 -0
- package/architecture/01-standards/distributed-systems-patterns.md +591 -0
- package/architecture/01-standards/event-driven-architecture.md +595 -0
- package/architecture/01-standards/microservices-patterns-complete.md +968 -0
- package/architecture/01-standards/microservices-patterns.md +495 -0
- package/architecture/01-standards/system-design-interview.md +664 -0
- package/architecture/02-playbooks/microservices-patterns-playbook.md +137 -0
- package/architecture/02-playbooks/migration-playbook.md +780 -0
- package/architecture/02-playbooks/system-design-playbook.md +779 -0
- package/architecture/03-checklists/architecture-decision-checklist.md +297 -0
- package/architecture/04-antipatterns/architecture-antipatterns.md +417 -0
- package/architecture/05-cases/case-netflix-microservices.md +413 -0
- package/architecture/06-glossary/architecture-glossary.md +164 -0
- package/architecture/adr-template-and-examples.md +38 -0
- package/architecture/api-gateway-deep-dive.md +1291 -0
- package/architecture/configuration-management.md +1162 -0
- package/architecture/distributed-transactions.md +1220 -0
- package/architecture/microservices-complete.md +735 -0
- package/architecture/resilience-and-disaster-patterns.md +37 -0
- package/architecture/service-governance.md +1198 -0
- package/architecture/system-architecture-deep-dive.md +37 -0
- package/backend/01-standards/analytics-and-growth.md +65 -0
- package/backend/01-standards/api-and-error-conventions.md +120 -0
- package/backend/01-standards/application-layering-and-packaging.md +160 -0
- package/backend/01-standards/auth-implementation.md +104 -0
- package/backend/01-standards/backend-framework-idioms.md +74 -0
- package/backend/01-standards/background-jobs-and-async.md +66 -0
- package/backend/01-standards/caching-strategies-complete.md +390 -0
- package/backend/01-standards/config-and-observability.md +77 -0
- package/backend/01-standards/data-modeling-and-persistence.md +94 -0
- package/backend/01-standards/django-complete.md +1765 -0
- package/backend/01-standards/email-and-notifications.md +64 -0
- package/backend/01-standards/fastapi-complete.md +925 -0
- package/backend/01-standards/file-upload-and-storage.md +66 -0
- package/backend/01-standards/graphql-api-complete.md +416 -0
- package/backend/01-standards/llm-application-standard.md +78 -0
- package/backend/01-standards/message-queue-patterns.md +379 -0
- package/backend/01-standards/microservices-and-distributed.md +78 -0
- package/backend/01-standards/nestjs-complete.md +2167 -0
- package/backend/01-standards/payment-integration.md +80 -0
- package/backend/01-standards/rate-limiting-complete.md +451 -0
- package/backend/01-standards/realtime-and-websocket.md +65 -0
- package/backend/01-standards/search-and-filtering.md +64 -0
- package/backend/01-standards/spring-boot-complete.md +445 -0
- package/backend/02-playbooks/api-design-playbook.md +718 -0
- package/backend/02-playbooks/email-send-playbook.md +130 -0
- package/backend/02-playbooks/file-upload-s3-playbook.md +153 -0
- package/backend/02-playbooks/typescript-enterprise-playbook.md +133 -0
- package/backend/02-playbooks/websocket-realtime-playbook.md +154 -0
- package/backend/03-checklists/api-launch-checklist.md +189 -0
- package/backend/04-antipatterns/backend-antipatterns.md +1051 -0
- package/blockchain/01-standards/blockchain-basics.md +557 -0
- package/blockchain/01-standards/smart-contract-development.md +1315 -0
- package/cicd/01-standards/deployment-and-delivery-standard.md +96 -0
- package/cicd/01-standards/github-actions-complete.md +473 -0
- package/cicd/01-standards/release-and-store-submission.md +75 -0
- package/cicd/02-playbooks/cicd-pipeline-playbook.md +144 -0
- package/cicd/02-playbooks/release-management-playbook.md +605 -0
- package/cicd/03-checklists/pipeline-security-checklist.md +168 -0
- package/cicd/04-antipatterns/cicd-antipatterns.md +589 -0
- package/cicd/05-cases/case-deployment-automation.md +221 -0
- package/cicd/05-cases/case-gitops-transformation.md +212 -0
- package/cicd/06-glossary/cicd-glossary.md +114 -0
- package/cicd/cicd-blueprint-deep-dive.md +38 -0
- package/cicd/release-readiness-gate.md +37 -0
- package/cloud-native/01-standards/container-security.md +741 -0
- package/cloud-native/01-standards/kubernetes-complete.md +812 -0
- package/cloud-native/02-playbooks/api-gateway-playbook.md +155 -0
- package/cloud-native/02-playbooks/gitops-with-argocd.md +760 -0
- package/cloud-native/02-playbooks/k8s-troubleshooting-playbook.md +1942 -0
- package/cloud-native/02-playbooks/message-queue-playbook.md +129 -0
- package/cloud-native/02-playbooks/multicloud-governance.md +726 -0
- package/cloud-native/02-playbooks/serverless-patterns.md +788 -0
- package/cloud-native/02-playbooks/service-mesh-playbook.md +612 -0
- package/cloud-native/02-playbooks/terraform-iac-playbook.md +143 -0
- package/cloud-native/03-checklists/container-security-checklist.md +431 -0
- package/cloud-native/03-checklists/k8s-production-readiness-checklist.md +460 -0
- package/cloud-native/04-antipatterns/container-antipatterns.md +660 -0
- package/cloud-native/04-antipatterns/k8s-antipatterns.md +743 -0
- package/cloud-native/05-cases/case-k8s-migration.md +478 -0
- package/cloud-native/05-cases/case-k8s-scaling.md +642 -0
- package/cloud-native/05-cases/case-k8s-security-incident.md +397 -0
- package/cloud-native/06-glossary/cloud-native-glossary.md +337 -0
- package/cross-platform/01-standards/cross-platform-frameworks.md +83 -0
- package/cross-platform/01-standards/platform-selection-and-architecture.md +77 -0
- package/data/01-standards/elasticsearch-complete.md +2098 -0
- package/data/01-standards/postgresql-complete.md +1613 -0
- package/data/01-standards/redis-complete.md +1527 -0
- package/data/02-playbooks/database-optimization-playbook.md +403 -0
- package/data/02-playbooks/elasticsearch-production-playbook.md +132 -0
- package/data/03-checklists/database-launch-checklist.md +187 -0
- package/data/04-antipatterns/database-antipatterns.md +873 -0
- package/data/05-cases/case-database-migration.md +310 -0
- package/data/06-glossary/database-glossary.md +440 -0
- package/data/data-governance-and-modeling-deep-dive.md +39 -0
- package/data-engineering/01-standards/airflow-complete.md +523 -0
- package/data-engineering/01-standards/kafka-complete.md +1521 -0
- package/data-engineering/02-playbooks/spark-etl-playbook.md +496 -0
- package/data-engineering/03-checklists/pipeline-launch-checklist.md +194 -0
- package/data-engineering/04-antipatterns/data-pipeline-antipatterns.md +684 -0
- package/data-engineering/05-cases/case-real-time-pipeline.md +355 -0
- package/data-engineering/06-glossary/data-engineering-glossary.md +429 -0
- package/database/01-standards/database-schema-standards.md +147 -0
- package/database/02-playbooks/postgresql-optimization-quick.md +52 -0
- package/database/02-playbooks/postgresql-performance-optimization.md +58 -0
- package/database/02-playbooks/postgresql-production-playbook.md +146 -0
- package/database/02-playbooks/redis-caching-playbook.md +117 -0
- package/database/03-checklists/database-review-checklist.md +50 -0
- package/database/04-antipatterns/database-antipatterns.md +112 -0
- package/design/01-standards/ui-design-system-complete.md +423 -0
- package/design/02-playbooks/design-handoff-playbook.md +254 -0
- package/design/02-playbooks/design-review-playbook.md +388 -0
- package/design/03-checklists/design-review-checklist.md +246 -0
- package/design/04-antipatterns/design-antipatterns.md +378 -0
- package/design/05-cases/case-design-system-adoption.md +328 -0
- package/design/06-glossary/design-glossary.md +329 -0
- package/design/ui-full-lifecycle-cross-platform-playbook.md +571 -0
- package/design/ux-system-deep-dive.md +38 -0
- package/design-systems/00-craft-rules.md +71 -0
- package/design-systems/aesthetic-families.md +43 -0
- package/design-systems/anti-ai-slop.md +162 -0
- package/design-systems/bold-geometric.md +120 -0
- package/design-systems/brutalist-bold.md +103 -0
- package/design-systems/editorial-clean.md +109 -0
- package/design-systems/glass-aurora.md +108 -0
- package/design-systems/modern-minimal.md +145 -0
- package/design-systems/premium-luxury.md +106 -0
- package/design-systems/product-type-design-map.md +48 -0
- package/design-systems/soft-warm.md +123 -0
- package/design-systems/tech-utility.md +113 -0
- package/desktop/01-standards/desktop-app-standard.md +72 -0
- package/desktop/01-standards/desktop-design.md +71 -0
- package/development/00-governance/document-template.md +41 -0
- package/development/01-standards/api-versioning-strategies.md +432 -0
- package/development/01-standards/authentication-patterns-complete.md +479 -0
- package/development/01-standards/css-architecture-complete.md +550 -0
- package/development/01-standards/database-migration-strategies.md +484 -0
- package/development/01-standards/elasticsearch-complete.md +347 -0
- package/development/01-standards/git-complete.md +371 -0
- package/development/01-standards/golang-complete.md +1565 -0
- package/development/01-standards/graphql-complete.md +298 -0
- package/development/01-standards/javascript-bundlers-complete.md +469 -0
- package/development/01-standards/javascript-typescript-complete.md +528 -0
- package/development/01-standards/jest-complete.md +275 -0
- package/development/01-standards/linux-complete.md +234 -0
- package/development/01-standards/logging-observability-complete.md +526 -0
- package/development/01-standards/microservices-communication.md +502 -0
- package/development/01-standards/mongodb-complete.md +406 -0
- package/development/01-standards/oauth2-complete.md +285 -0
- package/development/01-standards/performance-optimization-complete.md +289 -0
- package/development/01-standards/playwright-complete.md +247 -0
- package/development/01-standards/postgresql-complete.md +456 -0
- package/development/01-standards/pytest-complete.md +340 -0
- package/development/01-standards/python-async-programming.md +902 -0
- package/development/01-standards/python-complete.md +956 -0
- package/development/01-standards/python-decorators-complete.md +799 -0
- package/development/01-standards/python-design-patterns.md +2854 -0
- package/development/01-standards/python-packaging-distribution.md +420 -0
- package/development/01-standards/python-testing-strategies.md +607 -0
- package/development/01-standards/python-web-frameworks-comparison.md +471 -0
- package/development/01-standards/redis-complete.md +317 -0
- package/development/01-standards/rest-api-complete.md +316 -0
- package/development/01-standards/rust-complete.md +578 -0
- package/development/01-standards/typescript-advanced-types.md +1513 -0
- package/development/01-standards/web-security-complete.md +292 -0
- package/development/02-playbooks/api-design-playbook.md +810 -0
- package/development/02-playbooks/database-migration-playbook.md +580 -0
- package/development/02-playbooks/debugging-playbook.md +692 -0
- package/development/02-playbooks/feature-delivery-playbook.md +430 -0
- package/development/02-playbooks/incident-hotfix-playbook.md +387 -0
- package/development/02-playbooks/performance-optimization-playbook.md +531 -0
- package/development/02-playbooks/performance-tuning-playbook.md +652 -0
- package/development/02-playbooks/refactor-playbook.md +403 -0
- package/development/02-playbooks/release-playbook.md +469 -0
- package/development/03-checklists/architecture-review-checklist.md +168 -0
- package/development/03-checklists/data-migration-checklist.md +157 -0
- package/development/03-checklists/oncall-handover-checklist.md +173 -0
- package/development/03-checklists/pr-checklist.md +158 -0
- package/development/03-checklists/production-readiness-checklist.md +190 -0
- package/development/03-checklists/release-readiness-checklist.md +154 -0
- package/development/03-checklists/security-review-checklist.md +182 -0
- package/development/04-antipatterns/api-antipatterns.md +657 -0
- package/development/04-antipatterns/architecture-antipatterns.md +686 -0
- package/development/04-antipatterns/backend-antipatterns.md +648 -0
- package/development/04-antipatterns/cicd-antipatterns.md +540 -0
- package/development/04-antipatterns/code-smell-antipatterns.md +571 -0
- package/development/04-antipatterns/data-antipatterns.md +658 -0
- package/development/04-antipatterns/database-antipatterns.md +578 -0
- package/development/04-antipatterns/frontend-antipatterns.md +635 -0
- package/development/04-antipatterns/reliability-antipatterns.md +700 -0
- package/development/04-antipatterns/security-antipatterns.md +747 -0
- package/development/05-cases/case-api-version-migration.md +428 -0
- package/development/05-cases/case-authorization-hardening.md +383 -0
- package/development/05-cases/case-bluegreen-rollback.md +466 -0
- package/development/05-cases/case-cache-snowball-protection.md +485 -0
- package/development/05-cases/case-ci-cd-pipeline.md +544 -0
- package/development/05-cases/case-database-scaling.md +500 -0
- package/development/05-cases/case-db-hotspot-optimization.md +487 -0
- package/development/05-cases/case-incident-mttr-reduction.md +563 -0
- package/development/05-cases/case-microservice-migration.md +375 -0
- package/development/05-cases/case-performance-optimization.md +406 -0
- package/development/05-cases/case-security-incident-response.md +345 -0
- package/development/06-glossary/full-stack-glossary.md +166 -0
- package/development/09-maturity/quarterly-audit-template.md +35 -0
- package/development/11-ui-excellence/ui-aesthetic-system.md +41 -0
- package/development/11-ui-excellence/ui-engineering-excellence.md +435 -0
- package/development/12-scenarios/development-scenarios-guide.md +565 -0
- package/development/13-implementation-assets/implementation-toolkit.md +282 -0
- package/development/13-implementation-assets/knowledge-gates-execution.md +43 -0
- package/development/14-full-lifecycle/software-lifecycle-gates.md +511 -0
- package/development/15-lifecycle-templates/project-templates-collection.md +791 -0
- package/development/api-contract-and-versioning-guide.md +36 -0
- package/development/api-governance-complete.md +43 -0
- package/development/backend-engineering-complete.md +43 -0
- package/development/code-review-quality-complete.md +43 -0
- package/development/concurrency-reliability-complete.md +43 -0
- package/development/database-engineering-complete.md +43 -0
- package/development/engineering-effectiveness-complete.md +43 -0
- package/development/engineering-standards-deep-dive.md +38 -0
- package/development/frontend-engineering-complete.md +43 -0
- package/development/performance-capacity-complete.md +43 -0
- package/development/refactor-migration-complete.md +42 -0
- package/development/refactoring-and-techdebt-playbook.md +37 -0
- package/development/security-in-development-complete.md +43 -0
- package/devops/01-standards/cicd-pipeline-complete.md +262 -0
- package/devops/01-standards/docker-complete.md +1490 -0
- package/devops/01-standards/github-actions-complete.md +337 -0
- package/devops/01-standards/kubernetes-complete.md +638 -0
- package/devops/01-standards/terraform-complete.md +2117 -0
- package/devops/02-playbooks/docker-compose-playbook.md +233 -0
- package/devops/02-playbooks/docker-k8s-production-playbook.md +186 -0
- package/devops/02-playbooks/docker-production-playbook.md +952 -0
- package/edge-iot/01-standards/edge-iot-complete.md +473 -0
- package/experts/architect/api-design.md +178 -0
- package/experts/architect/methodology.md +124 -0
- package/experts/architect/security.md +75 -0
- package/experts/backend-lead/methodology.md +216 -0
- package/experts/devops/methodology.md +160 -0
- package/experts/frontend-lead/methodology.md +178 -0
- package/experts/product-manager/industry/ecommerce.md +43 -0
- package/experts/product-manager/industry/saas.md +40 -0
- package/experts/product-manager/methodology.md +97 -0
- package/experts/qa-lead/methodology.md +123 -0
- package/experts/qa-lead/test-strategy.md +128 -0
- package/experts/uiux-designer/methodology.md +125 -0
- package/frontend/01-standards/accessibility-complete.md +532 -0
- package/frontend/01-standards/accessibility-standard.md +74 -0
- package/frontend/01-standards/admin-dashboard-and-crud.md +72 -0
- package/frontend/01-standards/design-tokens-complete.md +444 -0
- package/frontend/01-standards/forms-and-validation.md +77 -0
- package/frontend/01-standards/frontend-architecture-and-layering.md +119 -0
- package/frontend/01-standards/i18n-and-localization.md +65 -0
- package/frontend/01-standards/nextjs-complete.md +451 -0
- package/frontend/01-standards/react-complete.md +713 -0
- package/frontend/01-standards/react-hooks-complete-guide.md +1100 -0
- package/frontend/01-standards/react-hooks-complete.md +1171 -0
- package/frontend/01-standards/seo-and-web-vitals.md +77 -0
- package/frontend/01-standards/state-management-complete.md +444 -0
- package/frontend/01-standards/vue-complete.md +499 -0
- package/frontend/01-standards/vue3-complete.md +2002 -0
- package/frontend/01-standards/web-framework-best-practices.md +64 -0
- package/frontend/01-standards/web-performance-complete.md +495 -0
- package/frontend/02-playbooks/accessibility-a11y-playbook.md +161 -0
- package/frontend/02-playbooks/frontend-performance-playbook.md +707 -0
- package/frontend/02-playbooks/i18n-internationalization-playbook.md +120 -0
- package/frontend/02-playbooks/performance-optimization-playbook.md +163 -0
- package/frontend/02-playbooks/react-nextjs-production-playbook.md +167 -0
- package/frontend/02-playbooks/react-state-management-playbook.md +173 -0
- package/frontend/03-checklists/component-quality-checklist.md +166 -0
- package/frontend/03-checklists/frontend-launch-checklist.md +299 -0
- package/frontend/04-antipatterns/frontend-antipatterns.md +886 -0
- package/frontend/05-cases/case-performance-optimization.md +274 -0
- package/harmony/01-standards/harmonyos-arkts-standard.md +75 -0
- package/harmony/01-standards/harmonyos-design.md +65 -0
- package/high-quality-engineering-playbook.md +54 -0
- package/incident/01-standards/incident-response-complete.md +303 -0
- package/incident/02-playbooks/chaos-engineering-playbook.md +883 -0
- package/incident/02-playbooks/postmortem-playbook.md +398 -0
- package/incident/03-checklists/incident-readiness-checklist.md +181 -0
- package/incident/04-antipatterns/incident-antipatterns.md +490 -0
- package/incident/05-cases/case-cascade-failure.md +176 -0
- package/incident/06-glossary/incident-glossary.md +114 -0
- package/incident/postmortem-and-response-deep-dive.md +39 -0
- package/industries/ecommerce/ecommerce-complete.md +631 -0
- package/industries/education/education-complete.md +555 -0
- package/industries/fintech/fintech-complete.md +501 -0
- package/industries/gaming/gaming-complete.md +587 -0
- package/industries/healthcare/healthcare-complete.md +452 -0
- package/low-code/01-standards/low-code-complete.md +944 -0
- package/miniprogram/01-standards/ai-common-mistakes.md +61 -0
- package/miniprogram/01-standards/miniprogram-custom-navbar-capsule.md +77 -0
- package/miniprogram/01-standards/miniprogram-design.md +61 -0
- package/miniprogram/01-standards/miniprogram-standard.md +81 -0
- package/mobile/01-standards/android-material-design.md +70 -0
- package/mobile/01-standards/flutter-complete.md +384 -0
- package/mobile/01-standards/ios-design-hig.md +78 -0
- package/mobile/01-standards/mobile-app-standard.md +85 -0
- package/mobile/01-standards/react-native-complete.md +352 -0
- package/mobile/02-playbooks/mobile-cross-platform-playbook.md +175 -0
- package/mobile/02-playbooks/mobile-performance.md +473 -0
- package/mobile/03-checklists/mobile-release-checklist.md +234 -0
- package/mobile/04-antipatterns/mobile-antipatterns.md +798 -0
- package/mobile/05-cases/case-app-performance.md +500 -0
- package/mobile/05-cases/case-app-startup-optimization.md +218 -0
- package/mobile/06-glossary/mobile-glossary.md +484 -0
- package/observability/01-standards/observability-standards.md +103 -0
- package/observability/02-playbooks/prometheus-grafana-playbook.md +135 -0
- package/observability/02-playbooks/structured-logging-playbook.md +73 -0
- package/observability/03-checklists/observability-checklist.md +54 -0
- package/observability/04-antipatterns/observability-antipatterns.md +106 -0
- package/operations/01-standards/prometheus-monitoring-complete.md +1578 -0
- package/operations/02-playbooks/capacity-planning-playbook.md +620 -0
- package/operations/03-checklists/production-launch-checklist.md +365 -0
- package/operations/04-antipatterns/operations-antipatterns.md +664 -0
- package/operations/05-cases/case-sre-practices.md +581 -0
- package/operations/06-glossary/operations-glossary.md +120 -0
- package/operations/aiops-anomaly-detection.md +758 -0
- package/operations/capacity-planning.md +1061 -0
- package/operations/chaos-engineering.md +659 -0
- package/operations/incident-command-system.md +38 -0
- package/operations/observability-complete.md +442 -0
- package/operations/slo-sli-playbook.md +517 -0
- package/operations/sre-operations-deep-dive.md +39 -0
- package/package.json +8 -0
- package/performance/01-standards/performance-and-scalability.md +80 -0
- package/performance/01-standards/performance-standards.md +156 -0
- package/performance/02-playbooks/query-optimization-playbook.md +103 -0
- package/performance/03-checklists/performance-checklist.md +56 -0
- package/performance/04-antipatterns/performance-antipatterns.md +146 -0
- package/product/01-standards/product-management-complete.md +285 -0
- package/product/02-playbooks/feature-launch-playbook.md +207 -0
- package/product/02-playbooks/user-research-playbook.md +532 -0
- package/product/03-checklists/feature-launch-checklist.md +275 -0
- package/product/04-antipatterns/product-antipatterns.md +355 -0
- package/product/05-cases/case-mvp-to-scale.md +384 -0
- package/product/06-glossary/product-glossary.md +462 -0
- package/product/feature-prioritization-framework.md +40 -0
- package/product/kpi-and-metric-tree.md +37 -0
- package/product/product-discovery-and-prd-deep-dive.md +41 -0
- package/quantum/01-standards/quantum-complete.md +1186 -0
- package/security/01-standards/api-security-complete.md +511 -0
- package/security/01-standards/container-runtime-security.md +574 -0
- package/security/01-standards/data-protection-gdpr.md +543 -0
- package/security/01-standards/owasp-top10-complete.md +1890 -0
- package/security/01-standards/secure-coding-baseline.md +90 -0
- package/security/01-standards/supply-chain-security.md +441 -0
- package/security/01-standards/web-security-checklist.md +108 -0
- package/security/01-standards/zero-trust-architecture.md +521 -0
- package/security/02-playbooks/auth-sso-playbook.md +166 -0
- package/security/02-playbooks/incident-response-security-playbook.md +588 -0
- package/security/02-playbooks/owasp-api-security-playbook.md +129 -0
- package/security/02-playbooks/payment-integration-playbook.md +119 -0
- package/security/02-playbooks/penetration-testing-playbook.md +517 -0
- package/security/03-checklists/security-audit-checklist.md +356 -0
- package/security/04-antipatterns/security-coding-antipatterns.md +580 -0
- package/security/05-cases/case-log4shell-incident.md +537 -0
- package/security/05-cases/case-major-breaches.md +468 -0
- package/security/06-glossary/security-glossary.md +212 -0
- package/security/compliance-automation.md +993 -0
- package/security/container-security.md +680 -0
- package/security/devsecops-complete.md +426 -0
- package/security/sast-dast-sca.md +775 -0
- package/security/secrets-management.md +594 -0
- package/security/security-architecture-deep-dive.md +37 -0
- package/security/threat-modeling-stride-playbook.md +40 -0
- package/seed-templates/auth-system.md +59 -0
- package/seed-templates/blog-content.md +94 -0
- package/seed-templates/dashboard.md +89 -0
- package/seed-templates/docs-site.md +73 -0
- package/seed-templates/e-commerce.md +50 -0
- package/seed-templates/saas-landing.md +92 -0
- package/seed-templates/settings-page.md +51 -0
- package/testing/01-standards/test-strategy-and-layering.md +83 -0
- package/testing/01-standards/testing-strategy-complete.md +422 -0
- package/testing/01-standards/unit-testing-best-practices.md +118 -0
- package/testing/02-playbooks/e2e-testing-playbook.md +988 -0
- package/testing/02-playbooks/testing-strategy-playbook.md +126 -0
- package/testing/03-checklists/test-strategy-checklist.md +208 -0
- package/testing/04-antipatterns/testing-antipatterns.md +718 -0
- package/testing/05-cases/case-testing-transformation.md +300 -0
- package/testing/06-glossary/testing-glossary.md +110 -0
- package/testing/risk-based-test-matrix.md +36 -0
- package/testing/testing-strategy-deep-dive.md +37 -0
|
@@ -0,0 +1,925 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: fastapi-complete
|
|
3
|
+
title: FastAPI 完整指南
|
|
4
|
+
domain: backend
|
|
5
|
+
category: 01-standards
|
|
6
|
+
difficulty: intermediate
|
|
7
|
+
tags: [backend, complete, fastapi, 中间件, 依赖注入系统, 后台任务, 安全与认证, 快速开始]
|
|
8
|
+
quality_score: 70
|
|
9
|
+
last_updated: 2026-06-15
|
|
10
|
+
---
|
|
11
|
+
# FastAPI 完整指南
|
|
12
|
+
|
|
13
|
+
## 概述
|
|
14
|
+
|
|
15
|
+
FastAPI 是一个现代、高性能的 Python Web 框架,用于构建 API。基于 Starlette 和 Pydantic,利用 Python 3.8+ 的类型提示自动生成 OpenAPI 文档和 JSON Schema。FastAPI 的性能与 NodeJS 和 Go 相当,是最快的 Python 框架之一。
|
|
16
|
+
|
|
17
|
+
### 核心特性
|
|
18
|
+
|
|
19
|
+
- **高性能**: 与 NodeJS 和 Go 并驾齐驱(感谢 Starlette 和 Pydantic)
|
|
20
|
+
- **快速开发**: 开发速度提升 200%-300%(根据开发者反馈)
|
|
21
|
+
- **减少 Bug**: 减少约 40% 的人为错误(基于类型系统)
|
|
22
|
+
- **直观**: 完善的编辑器支持,自动补全随处可见
|
|
23
|
+
- **简单**: 易于使用和学习,文档完善
|
|
24
|
+
- **健壮**: 生产就绪,自动生成交互式文档
|
|
25
|
+
- **基于标准**: OpenAPI (Swagger), JSON Schema, OAuth2
|
|
26
|
+
|
|
27
|
+
### 为什么选择 FastAPI?
|
|
28
|
+
|
|
29
|
+
✅ **自动文档**: 自动生成 Swagger UI 和 ReDoc
|
|
30
|
+
✅ **类型安全**: 基于 Python 类型提示,编辑器友好
|
|
31
|
+
✅ **异步优先**: 原生支持 async/await
|
|
32
|
+
✅ **依赖注入**: 强大且简洁的依赖注入系统
|
|
33
|
+
✅ **数据验证**: 自动请求验证和序列化
|
|
34
|
+
✅ **测试友好**: 基于 pytest,测试简单
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 快速开始
|
|
39
|
+
|
|
40
|
+
### 安装
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pip install fastapi uvicorn[standard]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Hello World
|
|
47
|
+
|
|
48
|
+
```python
|
|
49
|
+
from fastapi import FastAPI
|
|
50
|
+
|
|
51
|
+
app = FastAPI()
|
|
52
|
+
|
|
53
|
+
@app.get("/")
|
|
54
|
+
async def root():
|
|
55
|
+
return {"message": "Hello World"}
|
|
56
|
+
|
|
57
|
+
@app.get("/items/{item_id}")
|
|
58
|
+
async def read_item(item_id: int):
|
|
59
|
+
return {"item_id": item_id}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 运行服务器
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# 开发模式
|
|
66
|
+
uvicorn main:app --reload
|
|
67
|
+
|
|
68
|
+
# 生产模式
|
|
69
|
+
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 访问自动文档
|
|
73
|
+
|
|
74
|
+
- Swagger UI: `http://localhost:8000/docs`
|
|
75
|
+
- ReDoc: `http://localhost:8000/redoc`
|
|
76
|
+
- OpenAPI JSON: `http://localhost:8000/openapi.json`
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## 核心概念
|
|
81
|
+
|
|
82
|
+
### 1. 路径操作 (Path Operations)
|
|
83
|
+
|
|
84
|
+
FastAPI 使用装饰器定义路由:
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
from fastapi import FastAPI
|
|
88
|
+
|
|
89
|
+
app = FastAPI()
|
|
90
|
+
|
|
91
|
+
# GET 请求
|
|
92
|
+
@app.get("/")
|
|
93
|
+
async def read_root():
|
|
94
|
+
return {"Hello": "World"}
|
|
95
|
+
|
|
96
|
+
# POST 请求
|
|
97
|
+
@app.post("/items/")
|
|
98
|
+
async def create_item(item: dict):
|
|
99
|
+
return {"item": item}
|
|
100
|
+
|
|
101
|
+
# PUT 请求
|
|
102
|
+
@app.put("/items/{item_id}")
|
|
103
|
+
async def update_item(item_id: int, item: dict):
|
|
104
|
+
return {"item_id": item_id, "item": item}
|
|
105
|
+
|
|
106
|
+
# DELETE 请求
|
|
107
|
+
@app.delete("/items/{item_id}")
|
|
108
|
+
async def delete_item(item_id: int):
|
|
109
|
+
return {"deleted": item_id}
|
|
110
|
+
|
|
111
|
+
# 其他: @app.options(), @app.head(), @app.patch(), @app.trace()
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 2. 路径参数 (Path Parameters)
|
|
115
|
+
|
|
116
|
+
```python
|
|
117
|
+
from fastapi import FastAPI
|
|
118
|
+
|
|
119
|
+
app = FastAPI()
|
|
120
|
+
|
|
121
|
+
@app.get("/items/{item_id}")
|
|
122
|
+
async def read_item(item_id: int):
|
|
123
|
+
"""路径参数自动转换为 int 类型"""
|
|
124
|
+
return {"item_id": item_id}
|
|
125
|
+
|
|
126
|
+
@app.get("/users/{user_id}/items/{item_id}")
|
|
127
|
+
async def read_user_item(user_id: int, item_id: str):
|
|
128
|
+
"""多个路径参数"""
|
|
129
|
+
return {"user_id": user_id, "item_id": item_id}
|
|
130
|
+
|
|
131
|
+
# 枚举路径参数
|
|
132
|
+
from enum import Enum
|
|
133
|
+
|
|
134
|
+
class ModelName(str, Enum):
|
|
135
|
+
alexnet = "alexnet"
|
|
136
|
+
resnet = "resnet"
|
|
137
|
+
lenet = "lenet"
|
|
138
|
+
|
|
139
|
+
@app.get("/models/{model_name}")
|
|
140
|
+
async def get_model(model_name: ModelName):
|
|
141
|
+
if model_name == ModelName.alexnet:
|
|
142
|
+
return {"model": model_name, "message": "Deep Learning FTW!"}
|
|
143
|
+
return {"model": model_name}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 3. 查询参数 (Query Parameters)
|
|
147
|
+
|
|
148
|
+
```python
|
|
149
|
+
from fastapi import FastAPI
|
|
150
|
+
|
|
151
|
+
app = FastAPI()
|
|
152
|
+
|
|
153
|
+
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
|
|
154
|
+
|
|
155
|
+
@app.get("/items/")
|
|
156
|
+
async def read_item(skip: int = 0, limit: int = 10):
|
|
157
|
+
"""查询参数带默认值"""
|
|
158
|
+
return fake_items_db[skip : skip + limit]
|
|
159
|
+
|
|
160
|
+
# 必需查询参数
|
|
161
|
+
@app.get("/items/{item_id}")
|
|
162
|
+
async def read_item(item_id: str, needy: str):
|
|
163
|
+
"""needy 是必需的查询参数"""
|
|
164
|
+
return {"item_id": item_id, "needy": needy}
|
|
165
|
+
|
|
166
|
+
# 可选查询参数
|
|
167
|
+
from typing import Optional
|
|
168
|
+
|
|
169
|
+
@app.get("/users/{user_id}/items/{item_id}")
|
|
170
|
+
async def read_user_item(
|
|
171
|
+
user_id: int,
|
|
172
|
+
item_id: str,
|
|
173
|
+
q: Optional[str] = None,
|
|
174
|
+
short: bool = False
|
|
175
|
+
):
|
|
176
|
+
item = {"item_id": item_id, "owner_id": user_id}
|
|
177
|
+
if q:
|
|
178
|
+
item.update({"q": q})
|
|
179
|
+
if not short:
|
|
180
|
+
item.update({"description": "This is an amazing item"})
|
|
181
|
+
return item
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### 4. 请求体 (Request Body)
|
|
185
|
+
|
|
186
|
+
使用 Pydantic 模型定义请求体:
|
|
187
|
+
|
|
188
|
+
```python
|
|
189
|
+
from fastapi import FastAPI
|
|
190
|
+
from pydantic import BaseModel
|
|
191
|
+
from typing import Optional
|
|
192
|
+
|
|
193
|
+
app = FastAPI()
|
|
194
|
+
|
|
195
|
+
class Item(BaseModel):
|
|
196
|
+
name: str
|
|
197
|
+
description: Optional[str] = None
|
|
198
|
+
price: float
|
|
199
|
+
tax: Optional[float] = None
|
|
200
|
+
|
|
201
|
+
@app.post("/items/")
|
|
202
|
+
async def create_item(item: Item):
|
|
203
|
+
return item
|
|
204
|
+
|
|
205
|
+
@app.put("/items/{item_id}")
|
|
206
|
+
async def update_item(item_id: int, item: Item, q: Optional[str] = None):
|
|
207
|
+
result = {"item_id": item_id, "item": item}
|
|
208
|
+
if q:
|
|
209
|
+
result.update({"q": q})
|
|
210
|
+
return result
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### 5. Pydantic 模型详解
|
|
214
|
+
|
|
215
|
+
```python
|
|
216
|
+
from pydantic import BaseModel, Field, validator
|
|
217
|
+
from typing import Optional, List
|
|
218
|
+
from datetime import datetime
|
|
219
|
+
|
|
220
|
+
class User(BaseModel):
|
|
221
|
+
id: int
|
|
222
|
+
name: str = Field(..., min_length=1, max_length=50, description="用户名")
|
|
223
|
+
email: str = Field(..., regex=r"^[\w\.-]+@[\w\.-]+\.\w+$")
|
|
224
|
+
age: Optional[int] = Field(None, ge=0, le=120, description="年龄")
|
|
225
|
+
tags: List[str] = Field(default_factory=list)
|
|
226
|
+
created_at: datetime = Field(default_factory=datetime.now)
|
|
227
|
+
|
|
228
|
+
@validator('name')
|
|
229
|
+
def name_must_not_contain_space(cls, v):
|
|
230
|
+
if ' ' in v:
|
|
231
|
+
raise ValueError('must not contain a space')
|
|
232
|
+
return v.title()
|
|
233
|
+
|
|
234
|
+
class Item(BaseModel):
|
|
235
|
+
name: str
|
|
236
|
+
description: Optional[str] = None
|
|
237
|
+
price: float = Field(..., gt=0, description="价格必须大于 0")
|
|
238
|
+
tax: Optional[float] = None
|
|
239
|
+
|
|
240
|
+
class Config:
|
|
241
|
+
schema_extra = {
|
|
242
|
+
"example": {
|
|
243
|
+
"name": "Foo",
|
|
244
|
+
"description": "A very nice Item",
|
|
245
|
+
"price": 35.4,
|
|
246
|
+
"tax": 3.2,
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
@app.post("/users/")
|
|
251
|
+
async def create_user(user: User):
|
|
252
|
+
return user
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## 依赖注入系统
|
|
258
|
+
|
|
259
|
+
FastAPI 的依赖注入系统是一个强大而简洁的特性。
|
|
260
|
+
|
|
261
|
+
### 基本用法
|
|
262
|
+
|
|
263
|
+
```python
|
|
264
|
+
from fastapi import FastAPI, Depends
|
|
265
|
+
|
|
266
|
+
app = FastAPI()
|
|
267
|
+
|
|
268
|
+
async def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
|
|
269
|
+
return {"q": q, "skip": skip, "limit": limit}
|
|
270
|
+
|
|
271
|
+
@app.get("/items/")
|
|
272
|
+
async def read_items(commons: dict = Depends(common_parameters)):
|
|
273
|
+
return commons
|
|
274
|
+
|
|
275
|
+
@app.get("/users/")
|
|
276
|
+
async def read_users(commons: dict = Depends(common_parameters)):
|
|
277
|
+
return commons
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### 类作为依赖
|
|
281
|
+
|
|
282
|
+
```python
|
|
283
|
+
from fastapi import FastAPI, Depends
|
|
284
|
+
|
|
285
|
+
app = FastAPI()
|
|
286
|
+
|
|
287
|
+
class CommonParams:
|
|
288
|
+
def __init__(self, q: Optional[str] = None, skip: int = 0, limit: int = 100):
|
|
289
|
+
self.q = q
|
|
290
|
+
self.skip = skip
|
|
291
|
+
self.limit = limit
|
|
292
|
+
|
|
293
|
+
@app.get("/items/")
|
|
294
|
+
async def read_items(commons: CommonParams = Depends()):
|
|
295
|
+
return {"q": commons.q, "skip": commons.skip, "limit": commons.limit}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### 可调用依赖
|
|
299
|
+
|
|
300
|
+
```python
|
|
301
|
+
from fastapi import FastAPI, Depends, HTTPException
|
|
302
|
+
|
|
303
|
+
app = FastAPI()
|
|
304
|
+
|
|
305
|
+
class FixedContentQueryChecker:
|
|
306
|
+
def __init__(self, fixed_content: str):
|
|
307
|
+
self.fixed_content = fixed_content
|
|
308
|
+
|
|
309
|
+
def __call__(self, q: str = ""):
|
|
310
|
+
if q:
|
|
311
|
+
return self.fixed_content in q
|
|
312
|
+
return False
|
|
313
|
+
|
|
314
|
+
checker = FixedContentQueryChecker("bar")
|
|
315
|
+
|
|
316
|
+
@app.get("/items/")
|
|
317
|
+
async def read_items(is_fixed: bool = Depends(checker)):
|
|
318
|
+
if is_fixed:
|
|
319
|
+
return {"result": "Query contains 'bar'"}
|
|
320
|
+
return {"result": "Query does not contain 'bar'"}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### 依赖树
|
|
324
|
+
|
|
325
|
+
```python
|
|
326
|
+
from fastapi import FastAPI, Depends
|
|
327
|
+
|
|
328
|
+
app = FastAPI()
|
|
329
|
+
|
|
330
|
+
def query_extractor(q: Optional[str] = None):
|
|
331
|
+
return q
|
|
332
|
+
|
|
333
|
+
def query_or_cookie_extractor(
|
|
334
|
+
q: str = Depends(query_extractor),
|
|
335
|
+
last_query: Optional[str] = None
|
|
336
|
+
):
|
|
337
|
+
if not q:
|
|
338
|
+
return last_query
|
|
339
|
+
return q
|
|
340
|
+
|
|
341
|
+
@app.get("/items/")
|
|
342
|
+
async def read_query(query_extractor: str = Depends(query_or_cookie_extractor)):
|
|
343
|
+
return {"query": query_extractor}
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### 全局依赖
|
|
347
|
+
|
|
348
|
+
```python
|
|
349
|
+
from fastapi import FastAPI, Depends, Header, HTTPException
|
|
350
|
+
|
|
351
|
+
async def verify_token(x_token: str = Header(...)):
|
|
352
|
+
if x_token != "fake-super-secret-token":
|
|
353
|
+
raise HTTPException(status_code=400, detail="X-Token header invalid")
|
|
354
|
+
|
|
355
|
+
async def verify_key(x_key: str = Header(...)):
|
|
356
|
+
if x_key != "fake-super-secret-key":
|
|
357
|
+
raise HTTPException(status_code=400, detail="X-Key header invalid")
|
|
358
|
+
return x_key
|
|
359
|
+
|
|
360
|
+
app = FastAPI(dependencies=[Depends(verify_token), Depends(verify_key)])
|
|
361
|
+
|
|
362
|
+
@app.get("/items/")
|
|
363
|
+
async def read_items():
|
|
364
|
+
return [{"item": "Foo"}, {"item": "Bar"}]
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
## 安全与认证
|
|
370
|
+
|
|
371
|
+
### OAuth2 with JWT
|
|
372
|
+
|
|
373
|
+
```python
|
|
374
|
+
from fastapi import FastAPI, Depends, HTTPException, status
|
|
375
|
+
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
|
|
376
|
+
from pydantic import BaseModel
|
|
377
|
+
from typing import Optional
|
|
378
|
+
from datetime import datetime, timedelta
|
|
379
|
+
from jose import JWTError, jwt
|
|
380
|
+
from passlib.context import CryptContext
|
|
381
|
+
|
|
382
|
+
app = FastAPI()
|
|
383
|
+
|
|
384
|
+
# 配置
|
|
385
|
+
SECRET_KEY = "your-secret-key-here"
|
|
386
|
+
ALGORITHM = "HS256"
|
|
387
|
+
ACCESS_TOKEN_EXPIRE_MINUTES = 30
|
|
388
|
+
|
|
389
|
+
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
|
390
|
+
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
|
|
391
|
+
|
|
392
|
+
# 模型
|
|
393
|
+
class Token(BaseModel):
|
|
394
|
+
access_token: str
|
|
395
|
+
token_type: str
|
|
396
|
+
|
|
397
|
+
class TokenData(BaseModel):
|
|
398
|
+
username: Optional[str] = None
|
|
399
|
+
|
|
400
|
+
class User(BaseModel):
|
|
401
|
+
username: str
|
|
402
|
+
email: Optional[str] = None
|
|
403
|
+
full_name: Optional[str] = None
|
|
404
|
+
disabled: Optional[bool] = None
|
|
405
|
+
|
|
406
|
+
class UserInDB(User):
|
|
407
|
+
hashed_password: str
|
|
408
|
+
|
|
409
|
+
# 模拟数据库
|
|
410
|
+
fake_users_db = {
|
|
411
|
+
"johndoe": {
|
|
412
|
+
"username": "johndoe",
|
|
413
|
+
"full_name": "John Doe",
|
|
414
|
+
"email": "johndoe@example.com",
|
|
415
|
+
"hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW",
|
|
416
|
+
"disabled": False,
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
# 密码工具
|
|
421
|
+
def verify_password(plain_password, hashed_password):
|
|
422
|
+
return pwd_context.verify(plain_password, hashed_password)
|
|
423
|
+
|
|
424
|
+
def get_password_hash(password):
|
|
425
|
+
return pwd_context.hash(password)
|
|
426
|
+
|
|
427
|
+
def get_user(db, username: str):
|
|
428
|
+
if username in db:
|
|
429
|
+
user_dict = db[username]
|
|
430
|
+
return UserInDB(**user_dict)
|
|
431
|
+
|
|
432
|
+
def authenticate_user(fake_db, username: str, password: str):
|
|
433
|
+
user = get_user(fake_db, username)
|
|
434
|
+
if not user:
|
|
435
|
+
return False
|
|
436
|
+
if not verify_password(password, user.hashed_password):
|
|
437
|
+
return False
|
|
438
|
+
return user
|
|
439
|
+
|
|
440
|
+
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
|
|
441
|
+
to_encode = data.copy()
|
|
442
|
+
if expires_delta:
|
|
443
|
+
expire = datetime.utcnow() + expires_delta
|
|
444
|
+
else:
|
|
445
|
+
expire = datetime.utcnow() + timedelta(minutes=15)
|
|
446
|
+
to_encode.update({"exp": expire})
|
|
447
|
+
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
|
|
448
|
+
return encoded_jwt
|
|
449
|
+
|
|
450
|
+
async def get_current_user(token: str = Depends(oauth2_scheme)):
|
|
451
|
+
credentials_exception = HTTPException(
|
|
452
|
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
453
|
+
detail="Could not validate credentials",
|
|
454
|
+
headers={"WWW-Authenticate": "Bearer"},
|
|
455
|
+
)
|
|
456
|
+
try:
|
|
457
|
+
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
|
|
458
|
+
username: str = payload.get("sub")
|
|
459
|
+
if username is None:
|
|
460
|
+
raise credentials_exception
|
|
461
|
+
token_data = TokenData(username=username)
|
|
462
|
+
except JWTError:
|
|
463
|
+
raise credentials_exception
|
|
464
|
+
user = get_user(fake_users_db, username=token_data.username)
|
|
465
|
+
if user is None:
|
|
466
|
+
raise credentials_exception
|
|
467
|
+
return user
|
|
468
|
+
|
|
469
|
+
async def get_current_active_user(current_user: UserInDB = Depends(get_current_user)):
|
|
470
|
+
if current_user.disabled:
|
|
471
|
+
raise HTTPException(status_code=400, detail="Inactive user")
|
|
472
|
+
return current_user
|
|
473
|
+
|
|
474
|
+
# 路由
|
|
475
|
+
@app.post("/token", response_model=Token)
|
|
476
|
+
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
|
|
477
|
+
user = authenticate_user(fake_users_db, form_data.username, form_data.password)
|
|
478
|
+
if not user:
|
|
479
|
+
raise HTTPException(
|
|
480
|
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
481
|
+
detail="Incorrect username or password",
|
|
482
|
+
headers={"WWW-Authenticate": "Bearer"},
|
|
483
|
+
)
|
|
484
|
+
access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
|
|
485
|
+
access_token = create_access_token(
|
|
486
|
+
data={"sub": user.username}, expires_delta=access_token_expires
|
|
487
|
+
)
|
|
488
|
+
return {"access_token": access_token, "token_type": "bearer"}
|
|
489
|
+
|
|
490
|
+
@app.get("/users/me/", response_model=User)
|
|
491
|
+
async def read_users_me(current_user: User = Depends(get_current_active_user)):
|
|
492
|
+
return current_user
|
|
493
|
+
|
|
494
|
+
@app.get("/users/me/items/")
|
|
495
|
+
async def read_own_items(current_user: User = Depends(get_current_active_user)):
|
|
496
|
+
return [{"item_id": "Foo", "owner": current_user.username}]
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
### API Key 认证
|
|
500
|
+
|
|
501
|
+
```python
|
|
502
|
+
from fastapi import FastAPI, Depends, HTTPException, status
|
|
503
|
+
from fastapi.security import APIKeyHeader
|
|
504
|
+
|
|
505
|
+
app = FastAPI()
|
|
506
|
+
|
|
507
|
+
API_KEY = "your-api-key-here"
|
|
508
|
+
api_key_header = APIKeyHeader(name="X-API-Key")
|
|
509
|
+
|
|
510
|
+
async def get_api_key(api_key: str = Depends(api_key_header)):
|
|
511
|
+
if api_key != API_KEY:
|
|
512
|
+
raise HTTPException(
|
|
513
|
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
514
|
+
detail="Invalid API Key"
|
|
515
|
+
)
|
|
516
|
+
return api_key
|
|
517
|
+
|
|
518
|
+
@app.get("/protected/")
|
|
519
|
+
async def protected_route(api_key: str = Depends(get_api_key)):
|
|
520
|
+
return {"message": "Access granted"}
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
---
|
|
524
|
+
|
|
525
|
+
## 数据库集成
|
|
526
|
+
|
|
527
|
+
### SQLAlchemy 异步
|
|
528
|
+
|
|
529
|
+
```python
|
|
530
|
+
from fastapi import FastAPI, Depends, HTTPException
|
|
531
|
+
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
|
532
|
+
from sqlalchemy.orm import sessionmaker, declarative_base
|
|
533
|
+
from sqlalchemy import Column, Integer, String, select
|
|
534
|
+
from typing import List, Optional
|
|
535
|
+
from pydantic import BaseModel
|
|
536
|
+
|
|
537
|
+
# 数据库配置
|
|
538
|
+
SQLALCHEMY_DATABASE_URL = "sqlite+aiosqlite:///./test.db"
|
|
539
|
+
# SQLALCHEMY_DATABASE_URL = "postgresql+asyncpg://user:password@localhost/dbname"
|
|
540
|
+
|
|
541
|
+
engine = create_async_engine(SQLALCHEMY_DATABASE_URL, echo=True)
|
|
542
|
+
AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
|
|
543
|
+
Base = declarative_base()
|
|
544
|
+
|
|
545
|
+
# 模型
|
|
546
|
+
class User(Base):
|
|
547
|
+
__tablename__ = "users"
|
|
548
|
+
id = Column(Integer, primary_key=True, index=True)
|
|
549
|
+
name = Column(String)
|
|
550
|
+
email = Column(String, unique=True, index=True)
|
|
551
|
+
|
|
552
|
+
# Pydantic 模型
|
|
553
|
+
class UserCreate(BaseModel):
|
|
554
|
+
name: str
|
|
555
|
+
email: str
|
|
556
|
+
|
|
557
|
+
class UserResponse(BaseModel):
|
|
558
|
+
id: int
|
|
559
|
+
name: str
|
|
560
|
+
email: str
|
|
561
|
+
|
|
562
|
+
class Config:
|
|
563
|
+
orm_mode = True
|
|
564
|
+
|
|
565
|
+
# 依赖
|
|
566
|
+
async def get_db():
|
|
567
|
+
async with AsyncSessionLocal() as session:
|
|
568
|
+
try:
|
|
569
|
+
yield session
|
|
570
|
+
finally:
|
|
571
|
+
await session.close()
|
|
572
|
+
|
|
573
|
+
# 应用
|
|
574
|
+
app = FastAPI()
|
|
575
|
+
|
|
576
|
+
# 创建表
|
|
577
|
+
@app.on_event("startup")
|
|
578
|
+
async def startup():
|
|
579
|
+
async with engine.begin() as conn:
|
|
580
|
+
await conn.run_sync(Base.metadata.create_all)
|
|
581
|
+
|
|
582
|
+
# 路由
|
|
583
|
+
@app.post("/users/", response_model=UserResponse)
|
|
584
|
+
async def create_user(user: UserCreate, db: AsyncSession = Depends(get_db)):
|
|
585
|
+
db_user = User(**user.dict())
|
|
586
|
+
db.add(db_user)
|
|
587
|
+
await db.commit()
|
|
588
|
+
await db.refresh(db_user)
|
|
589
|
+
return db_user
|
|
590
|
+
|
|
591
|
+
@app.get("/users/", response_model=List[UserResponse])
|
|
592
|
+
async def read_users(skip: int = 0, limit: int = 100, db: AsyncSession = Depends(get_db)):
|
|
593
|
+
result = await db.execute(select(User).offset(skip).limit(limit))
|
|
594
|
+
users = result.scalars().all()
|
|
595
|
+
return users
|
|
596
|
+
|
|
597
|
+
@app.get("/users/{user_id}", response_model=UserResponse)
|
|
598
|
+
async def read_user(user_id: int, db: AsyncSession = Depends(get_db)):
|
|
599
|
+
result = await db.execute(select(User).where(User.id == user_id))
|
|
600
|
+
user = result.scalar_one_or_none()
|
|
601
|
+
if user is None:
|
|
602
|
+
raise HTTPException(status_code=404, detail="User not found")
|
|
603
|
+
return user
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
---
|
|
607
|
+
|
|
608
|
+
## 中间件
|
|
609
|
+
|
|
610
|
+
### 自定义中间件
|
|
611
|
+
|
|
612
|
+
```python
|
|
613
|
+
from fastapi import FastAPI, Request, Response
|
|
614
|
+
import time
|
|
615
|
+
|
|
616
|
+
app = FastAPI()
|
|
617
|
+
|
|
618
|
+
@app.middleware("http")
|
|
619
|
+
async def add_process_time_header(request: Request, call_next):
|
|
620
|
+
start_time = time.time()
|
|
621
|
+
response = await call_next(request)
|
|
622
|
+
process_time = time.time() - start_time
|
|
623
|
+
response.headers["X-Process-Time"] = str(process_time)
|
|
624
|
+
return response
|
|
625
|
+
|
|
626
|
+
# CORS 中间件
|
|
627
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
628
|
+
|
|
629
|
+
app.add_middleware(
|
|
630
|
+
CORSMiddleware,
|
|
631
|
+
allow_origins=["*"],
|
|
632
|
+
allow_credentials=True,
|
|
633
|
+
allow_methods=["*"],
|
|
634
|
+
allow_headers=["*"],
|
|
635
|
+
)
|
|
636
|
+
|
|
637
|
+
# GZip 中间件
|
|
638
|
+
from fastapi.middleware.gzip import GZipMiddleware
|
|
639
|
+
app.add_middleware(GZipMiddleware, minimum_size=1000)
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
---
|
|
643
|
+
|
|
644
|
+
## 后台任务
|
|
645
|
+
|
|
646
|
+
```python
|
|
647
|
+
from fastapi import FastAPI, BackgroundTasks
|
|
648
|
+
from typing import Optional
|
|
649
|
+
|
|
650
|
+
app = FastAPI()
|
|
651
|
+
|
|
652
|
+
def write_log(message: str):
|
|
653
|
+
with open("log.txt", mode="a") as log:
|
|
654
|
+
log.write(message + "\n")
|
|
655
|
+
|
|
656
|
+
@app.post("/send-notification/{email}")
|
|
657
|
+
async def send_notification(email: str, background_tasks: BackgroundTasks, q: Optional[str] = None):
|
|
658
|
+
message = f"notification to {email}\n"
|
|
659
|
+
if q:
|
|
660
|
+
message += f"query param: {q}\n"
|
|
661
|
+
|
|
662
|
+
background_tasks.add_task(write_log, message)
|
|
663
|
+
|
|
664
|
+
return {"message": "Notification sent in the background"}
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
---
|
|
668
|
+
|
|
669
|
+
## WebSocket
|
|
670
|
+
|
|
671
|
+
```python
|
|
672
|
+
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
|
|
673
|
+
from typing import List
|
|
674
|
+
|
|
675
|
+
app = FastAPI()
|
|
676
|
+
|
|
677
|
+
class ConnectionManager:
|
|
678
|
+
def __init__(self):
|
|
679
|
+
self.active_connections: List[WebSocket] = []
|
|
680
|
+
|
|
681
|
+
async def connect(self, websocket: WebSocket):
|
|
682
|
+
await websocket.accept()
|
|
683
|
+
self.active_connections.append(websocket)
|
|
684
|
+
|
|
685
|
+
def disconnect(self, websocket: WebSocket):
|
|
686
|
+
self.active_connections.remove(websocket)
|
|
687
|
+
|
|
688
|
+
async def send_personal_message(self, message: str, websocket: WebSocket):
|
|
689
|
+
await websocket.send_text(message)
|
|
690
|
+
|
|
691
|
+
async def broadcast(self, message: str):
|
|
692
|
+
for connection in self.active_connections:
|
|
693
|
+
await connection.send_text(message)
|
|
694
|
+
|
|
695
|
+
manager = ConnectionManager()
|
|
696
|
+
|
|
697
|
+
@app.get("/")
|
|
698
|
+
async def get():
|
|
699
|
+
return {"message": "WebSocket server is running"}
|
|
700
|
+
|
|
701
|
+
@app.websocket("/ws/{client_id}")
|
|
702
|
+
async def websocket_endpoint(websocket: WebSocket, client_id: int):
|
|
703
|
+
await manager.connect(websocket)
|
|
704
|
+
try:
|
|
705
|
+
while True:
|
|
706
|
+
data = await websocket.receive_text()
|
|
707
|
+
await manager.send_personal_message(f"You wrote: {data}", websocket)
|
|
708
|
+
await manager.broadcast(f"Client #{client_id} says: {data}")
|
|
709
|
+
except WebSocketDisconnect:
|
|
710
|
+
manager.disconnect(websocket)
|
|
711
|
+
await manager.broadcast(f"Client #{client_id} left the chat")
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
---
|
|
715
|
+
|
|
716
|
+
## 测试
|
|
717
|
+
|
|
718
|
+
```python
|
|
719
|
+
from fastapi.testclient import TestClient
|
|
720
|
+
from main import app
|
|
721
|
+
|
|
722
|
+
client = TestClient(app)
|
|
723
|
+
|
|
724
|
+
def test_read_main():
|
|
725
|
+
response = client.get("/")
|
|
726
|
+
assert response.status_code == 200
|
|
727
|
+
assert response.json() == {"message": "Hello World"}
|
|
728
|
+
|
|
729
|
+
def test_create_item():
|
|
730
|
+
response = client.post(
|
|
731
|
+
"/items/",
|
|
732
|
+
json={"name": "Item 1", "price": 10.5}
|
|
733
|
+
)
|
|
734
|
+
assert response.status_code == 200
|
|
735
|
+
assert response.json()["name"] == "Item 1"
|
|
736
|
+
|
|
737
|
+
def test_read_item():
|
|
738
|
+
response = client.get("/items/1")
|
|
739
|
+
assert response.status_code == 200
|
|
740
|
+
assert "item_id" in response.json()
|
|
741
|
+
|
|
742
|
+
# 异步测试
|
|
743
|
+
import pytest
|
|
744
|
+
from httpx import AsyncClient
|
|
745
|
+
|
|
746
|
+
@pytest.mark.asyncio
|
|
747
|
+
async def test_async_read_main():
|
|
748
|
+
async with AsyncClient(app=app, base_url="http://test") as ac:
|
|
749
|
+
response = await ac.get("/")
|
|
750
|
+
assert response.status_code == 200
|
|
751
|
+
```
|
|
752
|
+
|
|
753
|
+
---
|
|
754
|
+
|
|
755
|
+
## 部署
|
|
756
|
+
|
|
757
|
+
### Docker 部署
|
|
758
|
+
|
|
759
|
+
```dockerfile
|
|
760
|
+
FROM python:3.11-slim
|
|
761
|
+
|
|
762
|
+
WORKDIR /app
|
|
763
|
+
|
|
764
|
+
COPY requirements.txt .
|
|
765
|
+
RUN pip install --no-cache-dir -r requirements.txt
|
|
766
|
+
|
|
767
|
+
COPY . .
|
|
768
|
+
|
|
769
|
+
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
### Gunicorn + Uvicorn
|
|
773
|
+
|
|
774
|
+
```bash
|
|
775
|
+
pip install gunicorn uvicorn[standard]
|
|
776
|
+
|
|
777
|
+
# 启动命令
|
|
778
|
+
gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
|
|
779
|
+
```
|
|
780
|
+
|
|
781
|
+
### Kubernetes 部署
|
|
782
|
+
|
|
783
|
+
```yaml
|
|
784
|
+
apiVersion: apps/v1
|
|
785
|
+
kind: Deployment
|
|
786
|
+
metadata:
|
|
787
|
+
name: fastapi-app
|
|
788
|
+
spec:
|
|
789
|
+
replicas: 3
|
|
790
|
+
selector:
|
|
791
|
+
matchLabels:
|
|
792
|
+
app: fastapi
|
|
793
|
+
template:
|
|
794
|
+
metadata:
|
|
795
|
+
labels:
|
|
796
|
+
app: fastapi
|
|
797
|
+
spec:
|
|
798
|
+
containers:
|
|
799
|
+
- name: fastapi
|
|
800
|
+
image: your-image:latest
|
|
801
|
+
ports:
|
|
802
|
+
- containerPort: 8000
|
|
803
|
+
resources:
|
|
804
|
+
requests:
|
|
805
|
+
memory: "256Mi"
|
|
806
|
+
cpu: "250m"
|
|
807
|
+
limits:
|
|
808
|
+
memory: "512Mi"
|
|
809
|
+
cpu: "500m"
|
|
810
|
+
---
|
|
811
|
+
apiVersion: v1
|
|
812
|
+
kind: Service
|
|
813
|
+
metadata:
|
|
814
|
+
name: fastapi-service
|
|
815
|
+
spec:
|
|
816
|
+
selector:
|
|
817
|
+
app: fastapi
|
|
818
|
+
ports:
|
|
819
|
+
- port: 80
|
|
820
|
+
targetPort: 8000
|
|
821
|
+
type: LoadBalancer
|
|
822
|
+
```
|
|
823
|
+
|
|
824
|
+
---
|
|
825
|
+
|
|
826
|
+
## 性能优化
|
|
827
|
+
|
|
828
|
+
### 1. 使用异步数据库驱动
|
|
829
|
+
|
|
830
|
+
```python
|
|
831
|
+
# ❌ 不好: 同步驱动
|
|
832
|
+
import psycopg2
|
|
833
|
+
|
|
834
|
+
# ✅ 好: 异步驱动
|
|
835
|
+
import asyncpg
|
|
836
|
+
from sqlalchemy.ext.asyncio import create_async_engine
|
|
837
|
+
```
|
|
838
|
+
|
|
839
|
+
### 2. 连接池配置
|
|
840
|
+
|
|
841
|
+
```python
|
|
842
|
+
from sqlalchemy.ext.asyncio import create_async_engine
|
|
843
|
+
|
|
844
|
+
engine = create_async_engine(
|
|
845
|
+
"postgresql+asyncpg://user:pass@localhost/db",
|
|
846
|
+
pool_size=20,
|
|
847
|
+
max_overflow=40,
|
|
848
|
+
pool_pre_ping=True,
|
|
849
|
+
pool_recycle=3600
|
|
850
|
+
)
|
|
851
|
+
```
|
|
852
|
+
|
|
853
|
+
### 3. 启用 GZip
|
|
854
|
+
|
|
855
|
+
```python
|
|
856
|
+
from fastapi.middleware.gzip import GZipMiddleware
|
|
857
|
+
|
|
858
|
+
app.add_middleware(GZipMiddleware, minimum_size=1000)
|
|
859
|
+
```
|
|
860
|
+
|
|
861
|
+
### 4. 使用 Redis 缓存
|
|
862
|
+
|
|
863
|
+
```python
|
|
864
|
+
from fastapi import FastAPI
|
|
865
|
+
from fastapi_cache import FastAPICache
|
|
866
|
+
from fastapi_cache.backends.redis import RedisBackend
|
|
867
|
+
from fastapi_cache.decorator import cache
|
|
868
|
+
from redis import asyncio as aioredis
|
|
869
|
+
|
|
870
|
+
app = FastAPI()
|
|
871
|
+
|
|
872
|
+
@app.on_event("startup")
|
|
873
|
+
async def startup():
|
|
874
|
+
redis = aioredis.from_url("redis://localhost", encoding="utf8", decode_responses=True)
|
|
875
|
+
FastAPICache.init(RedisBackend(redis), prefix="fastapi-cache")
|
|
876
|
+
|
|
877
|
+
@app.get("/expensive-query")
|
|
878
|
+
@cache(expire=60)
|
|
879
|
+
async def expensive_query():
|
|
880
|
+
# 执行昂贵查询
|
|
881
|
+
return {"data": "..."}
|
|
882
|
+
```
|
|
883
|
+
|
|
884
|
+
### 5. 批量操作
|
|
885
|
+
|
|
886
|
+
```python
|
|
887
|
+
# ❌ 不好: N+1 查询
|
|
888
|
+
for item in items:
|
|
889
|
+
db_item = await db.get(Item, item.id)
|
|
890
|
+
# ...
|
|
891
|
+
|
|
892
|
+
# ✅ 好: 批量查询
|
|
893
|
+
item_ids = [item.id for item in items]
|
|
894
|
+
result = await db.execute(select(Item).where(Item.id.in_(item_ids)))
|
|
895
|
+
items = result.scalars().all()
|
|
896
|
+
```
|
|
897
|
+
|
|
898
|
+
---
|
|
899
|
+
|
|
900
|
+
## 最佳实践
|
|
901
|
+
|
|
902
|
+
1. **✅ 使用类型提示**: FastAPI 的核心优势
|
|
903
|
+
2. **✅ 分离关注点**: 路由、模型、业务逻辑分离
|
|
904
|
+
3. **✅ 使用依赖注入**: 提高可测试性和可维护性
|
|
905
|
+
4. **✅ 使用 Pydantic 验证**: 充分利用数据验证
|
|
906
|
+
5. **✅ 编写测试**: 使用 pytest 和 TestClient
|
|
907
|
+
6. **✅ 使用环境变量**: 配置管理
|
|
908
|
+
7. **✅ 日志记录**: 使用 Python logging
|
|
909
|
+
8. **✅ 错误处理**: 自定义异常处理器
|
|
910
|
+
9. **✅ API 版本控制**: /v1, /v2 前缀
|
|
911
|
+
10. **✅ 文档完善**: 利用自动文档并添加示例
|
|
912
|
+
|
|
913
|
+
---
|
|
914
|
+
|
|
915
|
+
## 参考资料
|
|
916
|
+
|
|
917
|
+
- [FastAPI 官方文档](https://fastapi.tiangolo.com/)
|
|
918
|
+
- [FastAPI GitHub](https://github.com/tiangolo/fastapi)
|
|
919
|
+
- [Full Stack FastAPI PostgreSQL Template](https://github.com/tiangolo/full-stack-fastapi-postgresql)
|
|
920
|
+
|
|
921
|
+
---
|
|
922
|
+
|
|
923
|
+
**文档版本**: v1.0
|
|
924
|
+
**最后更新**: 2026-03-28
|
|
925
|
+
**质量评分**: 90/100
|