Django Ninja Extra 使用教程
1. 项目介绍
Django Ninja Extra 是一个基于 Django 的扩展库,旨在通过类基础的方法和额外的功能来加速 RESTful API 的开发。它结合了 Django 的强大功能和 Ninja 的简洁性,提供了诸如权限控制、依赖注入、路由管理等高级功能。
主要特性
- 类基础设计:使用类来定义 API,使代码结构更清晰。
- 权限管理:在路由或控制器级别轻松定义权限。
- 依赖注入:支持 Python Injector 或 django_injector 进行依赖注入。
- 高性能:得益于 Pydantic 和异步支持,执行速度非常快。
- 自动文档:基于 OpenAPI 和 JSON Schema 生成自动化的 API 文档。
2. 项目快速启动
安装
首先,使用 pip 安装 Django Ninja Extra:
pip install django-ninja-extra
配置
在 Django 项目的 settings.py
文件中,将 ninja_extra
添加到 INSTALLED_APPS
:
INSTALLED_APPS = [
...
'ninja_extra',
...
]
创建 API
在你的 Django 项目中,创建一个新的 api.py
文件,并定义你的 API:
from ninja_extra import NinjaExtraAPI, api_controller, http_get
api = NinjaExtraAPI()
# 函数基础定义
@api.get("/add", tags=['Math'])
def add(request, a: int, b: int):
return {"result": a + b}
# 类基础定义
@api_controller('/', tags=['Math'], permissions=[])
class MathAPI:
@http_get('/subtract')
def subtract(self, a: int, b: int):
"""Subtracts a from b"""
return {"result": a - b}
@http_get('/divide')
def divide(self, a: int, b: int):
"""Divides a by b"""
return {"result": a / b}
@http_get('/multiply')
def multiply(self, a: int, b: int):
"""Multiplies a with b"""
return {"result": a * b}
api.register_controllers(MathAPI)
配置 URL
在 urls.py
中添加 API 的路由:
from django.urls import path
from .api import api
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', api.urls), # <----------
]
启动项目
运行 Django 开发服务器:
python manage.py runserver
访问 http://127.0.0.1:8000/api/docs
查看自动生成的 API 文档。
3. 应用案例和最佳实践
权限控制
Django Ninja Extra 允许你在控制器或路由级别定义权限。例如,你可以为特定的 API 端点设置权限:
from ninja_extra import permissions
@api_controller('/', tags=['Protected'], permissions=[permissions.IsAuthenticated])
class ProtectedAPI:
@http_get('/secret')
def secret(self, request):
return {"message": "This is a secret message"}
依赖注入
使用依赖注入可以简化代码并提高可测试性。Django Ninja Extra 支持 Python Injector 或 django_injector:
from injector import Injector, inject
injector = Injector()
class MyService:
def get_data(self):
return {"data": "some data"}
@api_controller('/', tags=['Injected'])
class InjectedAPI:
@inject
def __init__(self, service: MyService):
self.service = service
@http_get('/data')
def get_data(self):
return self.service.get_data()
4. 典型生态项目
Django Ninja JWT
Django Ninja JWT 是一个与 Django Ninja Extra 配合使用的 JWT 认证库,提供了简单易用的 JWT 认证功能。
Django Ninja Schema
Django Ninja Schema 是一个用于定义 API 输入输出的库,支持 Pydantic 模型,使得数据验证和序列化更加简单。
Django Ninja Throttling
Django Ninja Throttling 提供了 API 请求的限流功能,可以防止 API 被滥用。
通过这些生态项目,Django Ninja Extra 可以构建出功能强大且易于维护的 RESTful API 系统。