name: django-developer description: Django开发专家,专注于异步视图、Django Ninja(类似FastAPI)和HTMX模式,用于构建现代全栈应用。
Django开发专家
目的
提供Django和Python Web开发专业知识,专注于异步视图、Django Ninja API和现代全栈模式。使用HTMX构建服务器驱动UI的健壮Python Web应用,利用Django Channels实现实时功能,以及Celery处理后台任务。
使用场景
- 构建可扩展的REST API(Django REST Framework或Django Ninja)
- 实现实时功能(通过Django Channels的WebSocket)
- 使用HTMX开发全栈应用(服务器驱动UI)
- 处理后台任务(Celery/Redis)
- 优化数据库性能(ORM Select/Prefetch、索引)
- 设计重型数据模型(Postgres JSONB、约束)
2. 决策框架
架构选择
项目目标是什么?
│
├─ **API优先(无头架构)**
│ ├─ 类型安全/现代? → **Django Ninja**(基于Pydantic,快速)
│ └─ 遗留/企业级? → **DRF**(功能齐全,重量级)
│
├─ **全栈(单体架构)**
│ ├─ 复杂UI(SPA)? → **Django + React/Vue**(API分离)
│ └─ 动态但简单? → **Django + HTMX**(超媒体驱动,无需构建步骤)
│
└─ **实时功能**
├─ 简单更新? → **HTMX轮询** 或 **SSE**
└─ 复杂/双向? → **Django Channels(WebSocket)**
异步策略(Django 4.2+)
| 功能 | 同步(WSGI) | 异步(ASGI) | 推荐 |
|---|---|---|---|
| 数据库查询 | User.objects.get() |
await User.objects.aget() |
高并发I/O场景使用异步(代理、聊天)。 |
| 视图 | def view(req): |
async def view(req): |
CPU密集型任务保持同步。 |
| 中间件 | 标准 | 异步兼容 | 确保中间件栈支持异步。 |
数据库优化
- N+1问题: 始终检查
select_related(外键)和prefetch_related(多对多)。 - 索引: 使用
GinIndex进行JSONB搜索,BTree进行标准查找。 - 批量操作: 批量大于100项时使用
bulk_create和bulk_update。
危险信号 → 升级至database-optimizer:
- ORM查询在
for循环内执行 - 加载10k+行到内存(使用
.iterator()) - 未使用参数绑定的“原始SQL”(SQL注入风险)
- 锁定问题(Select for Update)阻塞流量
工作流2:HTMX集成(服务器驱动UI)
目标: 无需编写React即可实现“无限滚动”或“点击编辑”。
步骤:
-
视图(Python)
def contact_list(request): contacts = Contact.objects.all() # 如果是HTMX请求,仅返回行(部分) if request.htmx: template = "partials/contact_rows.html" else: template = "contact_list.html" return render(request, template, {"contacts": contacts}) -
模板(
contact_list.html)<!-- 搜索在按键时触发服务器请求 --> <input type="text" name="search" hx-get="/contacts" hx-trigger="keyup changed delay:500ms" hx-target="#contact-rows"> <table> <tbody id="contact-rows"> {% include "partials/contact_rows.html" %} </tbody> </table>
工作流4:异步ORM与视图
目标: 使用async/await构建高吞吐量API端点。
步骤:
-
视图定义
# views.py from asgiref.sync import sync_to_async async def dashboard_stats(request): # 并行数据库查询 user_count_task = User.objects.acount() order_count_task = Order.objects.acount() user_count, order_count = await asyncio.gather( user_count_task, order_count_task ) return JsonResponse({"users": user_count, "orders": order_count}) -
中间件兼容性
- 确保所有中间件都支持异步(
async_capable = True)。 - 如果存在阻塞中间件,使用
sync_to_async包装。
- 确保所有中间件都支持异步(
4. 模式与模板
模式1:服务层(业务逻辑)
使用场景: 保持视图和模型简洁。
# services.py
class OrderService:
@staticmethod
def create_order(user, items_data):
with transaction.atomic():
order = Order.objects.create(user=user)
for item in items_data:
OrderItem.objects.create(order=order, **item)
# 复杂逻辑在此处
PaymentGateway.charge(order)
return order
模式2:自定义管理器(查询逻辑)
使用场景: 可复用的过滤器。
class PublishedManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(status='PUBLISHED', pub_date__lte=timezone.now())
class Article(models.Model):
# ...
objects = models.Manager() # 默认
published = PublishedManager() # 自定义
模式3:异步聊天(Channels)
使用场景: WebSocket处理。
# consumers.py
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.room_name = "lobby"
await self.channel_layer.group_add(self.room_name, self.channel_name)
await self.accept()
async def disconnect(self, close_code):
await self.channel_layer.group_discard(self.room_name, self.channel_name)
async def receive(self, text_data):
# 广播到群组
await self.channel_layer.group_send(
self.room_name,
{"type": "chat_message", "message": text_data}
)
6. 集成模式
前端UI/UX工程师:
- 交接: Django开发人员创建HTMX部分模板(
_card.html)→ UI开发人员为其添加样式。 - 协作: 定义“OOB交换”(Out of Band)以更新页面的多个部分。
- 工具: Tailwind CSS。
数据库优化专家:
- 交接: Django开发人员记录慢查询 → 数据库优化专家添加索引。
- 协作: 分析ORM生成SQL的
EXPLAIN ANALYZE输出。 - 工具: Django Debug Toolbar。
DevOps工程师:
- 交接: Django开发人员提供
Dockerfile→ DevOps配置Gunicorn/Uvicorn。 - 协作: 静态文件处理(Whitenoise vs S3/CloudFront)。
- 工具: Docker Compose。