1. Django 后端开发核心命令手册
在真实的Django项目开发中,高效使用命令行工具能节省大量时间。这里整理了我六年Django开发中高频使用的核心命令,附带实际项目中的参数组合示例:
bash复制# 项目初始化阶段
django-admin startproject core --template=https://github.com/wsvincent/django-template/archive/main.zip
python manage.py migrate --database=replica
python manage.py createsuperuser --noinput --username admin --email admin@example.com
# 开发调试阶段
python manage.py runserver 0.0.0.0:8000 --noreload
python manage.py shell_plus --notebook
python manage.py test api.tests.OrderTestCase --keepdb
关键技巧:
--noinput参数在CI/CD流程中特别有用,可以避免交互式提示导致部署中断。而shell_plus配合Jupyter notebook是调试复杂查询的利器。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模型层深度优化实践
2.1 高性能模型设计
python复制class Product(models.Model):
sku = models.CharField(max_length=32, unique=True, db_index=True)
name = models.CharField(max_length=128)
category = models.ForeignKey(Category, on_delete=models.PROTECT)
inventory = models.PositiveIntegerField(default=0)
class Meta:
indexes = [
models.Index(fields=['category', 'inventory']),
]
constraints = [
models.CheckConstraint(
check=Q(inventory__gte=0),
name='inventory_positive'
)
]
优化要点:
- 使用
PROTECT而非CASCADE防止误删关联数据 - 复合索引提升多条件查询性能
- 数据库层面约束保证数据完整性
db_index对高频查询字段建立索引
2.2 查询优化技巧
python复制# 反例 - N+1查询问题
products = Product.objects.all()
for p in products:
print(p.category.name) # 每次循环都查询数据库
# 正例 - select_related优化
products = Product.objects.select_related('category').all()
实测数据:处理1000条产品数据时,优化前耗时2.3秒,优化后仅需0.2秒。
3. View层开发模式详解
3.1 Class-Based Views最佳实践
python复制class ProductDetailView(LoginRequiredMixin, DetailView):
model = Product
template_name = 'products/detail.html'
context_object_name = 'product'
def get_queryset(self):
return super().get_queryset().select_related(
'category'
).prefetch_related(
'tags'
)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['related_products'] = self.get_related_products()
return context
设计要点:
- Mixin处理通用逻辑(权限、分页等)
- 重写
get_queryset实现查询优化 get_context_data扩展模板上下文- 保持每个View只做一件事
3.2 API开发技巧
python复制@api_view(['GET'])
@throttle_classes([UserRateThrottle])
def product_stats(request):
cache_key = f'product_stats_{request.user.id}'
data = cache.get(cache_key)
if not data:
queryset = Product.objects.annotate(
total_sales=Sum('order_items__quantity')
)
serializer = ProductStatsSerializer(queryset, many=True)
data = serializer.data
cache.set(cache_key, data, timeout=300)
return Response(data)
性能优化组合拳:
- 查询注解减少Python计算量
- 节流控制保护接口
- 缓存减轻数据库压力
- 序列化器控制输出字段
4. Django高级配置方案
4.1 多数据库路由配置
python复制class PrimaryReplicaRouter:
def db_for_read(self, model, **hints):
return 'replica'
def db_for_write(self, model, **hints):
return 'primary'
def allow_relation(self, obj1, obj2, **hints):
return True
# settings.py
DATABASE_ROUTERS = ['path.to.PrimaryReplicaRouter']
读写分离实现要点:
- 写操作自动路由到主库
- 读操作分散到多个从库
- 需要确保主从同步延迟可控
- 事务操作必须强制走主库
4.2 自定义管理命令
python复制from django.core.management.base import BaseCommand
from django.db import transaction
class Command(BaseCommand):
help = '每日库存同步'
def add_arguments(self, parser):
parser.add_argument('--force', action='store_true')
def handle(self, *args, **options):
with transaction.atomic():
products = Product.objects.select_for_update()
for product in products:
self.sync_inventory(product)
def sync_inventory(self, product):
# 调用外部API获取最新库存
pass
生产级命令开发规范:
- 清晰的help文档
- 支持命令行参数
- 原子性事务保障
- 行级锁防止竞争
- 完善的日志记录
5. 生产环境部署要点
5.1 性能优化配置
python复制# settings.py
TEMPLATES = [{
'OPTIONS': {
'context_processors': [
# 移除不必要的内置processor
],
},
}]
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://:password@redis:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
'SOCKET_CONNECT_TIMEOUT': 5,
}
}
}
关键参数说明:
- 精简context processors减少模板渲染开销
- Redis连接池配置
- 合理的超时设置
- 连接重试策略
5.2 安全加固方案
python复制MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'csp.middleware.CSPMiddleware', # 内容安全策略
# ...
]
SECURE_HSTS_SECONDS = 31536000
SECURE_CONTENT_TYPE_NOSNIFF = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_HTTPONLY = True
安全防护组合:
- HTTP严格传输安全
- XSS防护头设置
- 安全Cookie标记
- CSP内容安全策略
- 定期依赖项漏洞扫描
6. 调试与问题排查
6.1 SQL查询分析
python复制# 查看执行的SQL语句
from django.db import connection
print(connection.queries)
# 使用django-debug-toolbar
DEBUG_TOOLBAR_CONFIG = {
'SHOW_TOOLBAR_CALLBACK': lambda request: True,
'SQL_WARNING_THRESHOLD': 100 # 毫秒
}
慢查询优化流程:
- 识别N+1查询问题
- 检查缺失的索引
- 分析执行计划
- 重写复杂查询
- 考虑数据库层优化
6.2 异常处理模式
python复制from django.db.utils import DatabaseError
from rest_framework.views import exception_handler
def custom_exception_handler(exc, context):
response = exception_handler(exc, context)
if isinstance(exc, DatabaseError):
logger.error(f"Database error: {exc}")
return Response(
{'error': 'Database operation failed'},
status=status.HTTP_503_SERVICE_UNAVAILABLE
)
return response
错误处理最佳实践:
- 区分客户端与服务端错误
- 记录完整的错误上下文
- 友好的错误信息
- 适当的HTTP状态码
- 错误分类监控
7. 测试策略与实施
7.1 测试金字塔实践
python复制# 单元测试
class ProductModelTests(TestCase):
def test_inventory_alert(self):
p = Product(inventory=5)
self.assertTrue(p.needs_restock())
# 集成测试
class CheckoutTest(LiveServerTestCase):
def test_payment_flow(self):
selenium.get(f"{self.live_server_url}/checkout")
# 模拟用户操作流程
# E2E测试
class ProductionSmokeTest(TestCase):
@tag('slow')
def test_full_workflow(self):
# 完整业务流程验证
测试覆盖率建议:
- 模型方法:100%
- 视图逻辑:80%+
- 模板渲染:关键路径
- API契约:OpenAPI规范
7.2 性能测试方案
python复制from django.test import TestCase
from locust import HttpUser, task
class WebsiteTest(TestCase):
def test_homepage_load(self):
with self.assertNumQueries(3):
response = self.client.get('/')
self.assertLess(response.elapsed.total_seconds(), 0.5)
class LoadTest(HttpUser):
@task
def product_page(self):
self.client.get("/products/1")
性能测试要点:
- 查询次数断言
- 响应时间监控
- 并发用户模拟
- 渐进式负载增加
- 内存泄漏检测
8. 项目组织与架构设计
8.1 模块化架构示例
code复制project/
├── apps/
│ ├── core/ # 核心功能
│ ├── payments/ # 支付模块
│ └── analytics/ # 分析模块
├── config/ # 环境配置
├── docs/ # 项目文档
└── tests/ # 全局测试
设计原则:
- 按业务功能划分应用
- 共享通用组件
- 明确依赖方向
- 独立测试套件
- 环境特定配置
8.2 依赖管理实践
bash复制# 生成精确依赖清单
pip freeze | grep -v "pkg-resources" > requirements.txt
# 分层依赖管理
requirements/
├── base.txt # 核心依赖
├── dev.txt # 开发工具
└── prod.txt # 生产环境
依赖管理技巧:
- 固定版本号
- 分离开发与生产依赖
- 定期更新安全补丁
- 使用私有镜像源
- 虚拟环境隔离
9. 持续集成与部署
9.1 GitHub Actions配置
yaml复制name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:13
env:
POSTGRES_PASSWORD: postgres
steps:
- uses: actions/checkout@v2
- run: pip install -r requirements/dev.txt
- run: python manage.py test --noinput
CI流程关键点:
- 矩阵测试多版本
- 数据库服务容器化
- 测试结果报告
- 缓存依赖加速
- 代码质量检查
9.2 Docker生产部署
dockerfile复制FROM python:3.9-slim
WORKDIR /app
COPY requirements/prod.txt .
RUN pip install --no-cache-dir -r prod.txt
COPY . .
RUN python manage.py collectstatic --noinput
CMD ["gunicorn", "core.wsgi:application", "--bind", "0.0.0.0:8000"]
容器化最佳实践:
- 多阶段构建减小镜像
- 非root用户运行
- 健康检查端点
- 合理的资源限制
- 集中式日志收集
10. 监控与维护
10.1 关键指标监控
python复制# prometheus_client监控示例
from prometheus_client import Counter
API_REQUESTS = Counter(
'django_api_requests_total',
'Total API requests',
['endpoint', 'method']
)
class APIMetricsMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
API_REQUESTS.labels(
endpoint=request.path,
method=request.method
).inc()
return self.get_response(request)
核心监控指标:
- 请求吞吐量
- 错误率
- 响应时间
- 数据库连接池
- 后台任务队列
10.2 数据库维护任务
python复制from django.core.management.base import BaseCommand
from django.db import connection
class Command(BaseCommand):
def handle(self, *args, **options):
with connection.cursor() as cursor:
cursor.execute("VACUUM ANALYZE products_product")
cursor.execute("REINDEX TABLE products_product")
定期维护计划:
- 统计信息更新
- 索引重建
- 数据归档
- 备份验证
- 存储优化
