Skip to content

开发规范

接口与路由

  • API 前缀:/api/v1
  • Swagger:/api/docs/swagger/

路由定义:config/urls.py

项目结构

youlai-django/
├── config/                  # 项目配置
│   ├── settings/            # 环境配置
│   │   ├── base.py          # 通用配置
│   │   ├── dev.py           # 开发配置
│   │   └── prod.py          # 生产配置
│   ├── urls.py              # 全局路由
│   ├── wsgi.py              # WSGI 入口
│   └── asgi.py              # ASGI 入口
├── core/                    # 公共基础能力
│   ├── viewsets/            # 基础视图集
│   ├── serializers/         # 基础序列化器
│   ├── permissions/         # 权限控制
│   └── ...                  # 其他(分页/过滤器/异常等)
├── system/                  # 系统核心模块
│   ├── users/               # 用户管理
│   ├── roles/               # 角色管理
│   ├── menus/               # 菜单管理
│   └── ...                  # 其他(部门/字典/日志等)
├── platform/                # 平台能力模块
│   ├── auth/                # 认证模块
│   ├── codegen/             # 代码生成
│   └── files/               # 文件上传
├── scripts/                 # 数据库脚本
├── manage.py                # Django 管理入口
└── .env                     # 环境变量

目录约定

目录说明
config/项目配置(settings/urls)
core/公共基础能力(异常/响应/工具)
system/系统管理模块(用户/角色/菜单)
platform/平台能力(认证/代码生成/文件)
infra/基础设施(日志/中间件)

代码风格

遵循 PEP 8:

类型命名风格示例
类名UpperCamelCaseUserProfile
函数/方法snake_caseget_user_by_id
变量snake_caseuser_name
常量UPPER_SNAKE_CASEMAX_PAGE_SIZE
包/模块snake_caseuser_views

DRF 开发规约

架构分层

  • ViewSet:处理 HTTP 请求,调用 Service/Serializer
  • Serializer:数据序列化与校验
  • Service:复杂业务逻辑抽取(可选)
  • Model:数据模型定义,禁止写复杂业务逻辑

ViewSet 示例

python
from rest_framework import viewsets
from rest_framework.decorators import action
from django_filters.rest_framework import DjangoFilterBackend

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_class = UserFilter

    @action(detail=False, methods=['get'])
    def profile(self, request):
        """获取当前用户信息"""
        user = request.user
        serializer = self.get_serializer(user)
        return Response(serializer.data)

Serializer 示例

python
from rest_framework import serializers
from django.core.validators import MinLengthValidator

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'phone', 'status']
        read_only_fields = ['id']

    def validate_phone(self, value):
        """验证手机号"""
        if not value.isdigit() or len(value) != 11:
            raise serializers.ValidationError('手机号格式不正确')
        return value

统一响应

所有接口返回统一格式:

python
from core.response import success, error

# 成功响应
return success(data=result)

# 错误响应
return error('认证失败', code='A0001')

响应格式

json
{
  "code": "00000",
  "msg": "操作成功",
  "data": { ... }
}

参数校验

使用 Serializer 校验

python
class CreateUserSerializer(serializers.Serializer):
    username = serializers.CharField(max_length=50)
    password = serializers.CharField(min_length=6, max_length=20)
    email = serializers.EmailField(required=False)

# 视图中使用
serializer = CreateUserSerializer(data=request.data)
if not serializer.is_valid():
    return error(serializer.errors, code='A0400')

异常处理

自定义异常

python
from core.exception import BusinessException

class BusinessException(Exception):
    def __init__(self, code: str, message: str):
        self.code = code
        self.message = message

# 使用
raise BusinessException('A0001', '认证失败')

全局异常处理

python
# core/exception.py
def exception_handler(exc, context):
    if isinstance(exc, BusinessException):
        return Response({
            'code': exc.code,
            'msg': exc.message,
            'data': None
        }, status=400)
    return None

接口幂等

  • 优先使用数据库唯一约束
  • 对高风险操作使用 Redis 分布式锁
python
from django.core.cache import cache

def create_order(request):
    lock_key = f"lock:order:{request.user.id}"
    lock = cache.add(lock_key, 1, 30)
    if not lock:
        return error('操作进行中,请勿重复提交', code='A0004')
    
    try:
        # 业务处理
        pass
    finally:
        cache.delete(lock_key)

数据库迁移

bash
# 生成迁移文件
python manage.py makemigrations

# 执行迁移
python manage.py migrate

# 初始导入 SQL 后
python manage.py migrate --fake-initial

相关文件

文件说明
core/response.py统一响应
core/exception.py异常处理
core/permissions/权限控制
core/viewsets/基础视图集

参考资料

基于 MIT 许可发布