在现代Web开发中,良好的代码组织架构至关重要。Django Ninja作为高性能的API框架,提供了强大的路由系统,帮助开发者实现API的模块化管理。本文将深入解析Django Ninja的路由机制,展示如何构建清晰、可维护的API结构。
典型的Django项目通常包含多个应用,每个应用处理特定的业务逻辑。Django Ninja建议为每个应用创建独立的路由模块:
project/
├── app1/
│ ├── api.py # 应用1的路由定义
│ └── models.py
├── app2/
│ ├── api.py # 应用2的路由定义
│ └── models.py
└── project/
├── api.py # 主API入口
└── urls.py
在每个应用的api.py
中,我们使用Router
类而非直接使用NinjaAPI
:
from ninja import Router
from .models import Product
router = Router()
@router.get("/")
def list_products(request):
return [{"id": p.id, "name": p.name} for p in Product.objects.all()]
@router.get("/{product_id}")
def product_detail(request, product_id: int):
product = Product.objects.get(id=product_id)
return {"name": product.name, "price": product.price}
这种设计实现了业务逻辑的隔离,每个应用只需关注自己的API端点。
在项目根目录的api.py
中,我们聚合所有子路由:
from ninja import NinjaAPI
from app1.api import router as app1_router
from app2.api import router as app2_router
api = NinjaAPI(title="项目API文档")
api.add_router("/products/", app1_router, tags=["商品管理"])
api.add_router("/orders/", app2_router, tags=["订单管理"])
add_router
方法支持两种引入方式:
"app.api.router"
)Django Ninja提供了便捷的全局配置方式:
# 应用级别认证
api.add_router("/secure/", secure_router, auth=TokenAuth())
# 或者直接在路由定义时指定
router = Router(auth=BasicAuth(), tags=["需要认证的操作"])
标签系统特别适合在Swagger文档中对API进行分组展示。
对于复杂业务场景,Django Ninja支持无限级嵌套路由:
core_router = Router()
v1_router = Router()
admin_router = Router()
# 定义各层级路由
@admin_router.get("/dashboard")
def admin_dashboard(request):
...
# 路由嵌套
v1_router.add_router("/admin/", admin_router)
core_router.add_router("/v1/", v1_router)
api.add_router("/api/", core_router)
最终生成的端点路径为:/api/v1/admin/dashboard
嵌套路由中可以实现参数继承:
@api.get("/user/{user_id}/profile")
def base_profile(request, user_id: int):
...
@router.get("/details")
def profile_details(request, user_id: int = Path(...)):
# 自动获取上层路由的user_id
...
api.add_router("/user/{user_id}/profile", router)
这种设计避免了参数重复定义,保持了URL结构的清晰性。
/v1/
、/v2/
等前缀实现API版本管理Django Ninja的路由系统提供了强大的模块化能力,使开发者能够构建清晰、可维护的API架构。通过合理使用基础路由、聚合路由和嵌套路由,可以轻松应对从简单到复杂的各种API开发场景。路由级别的认证和标签系统进一步提升了API的安全性和可管理性。