Skip to content

View层规范

概述

View 层负责处理 HTTP 请求和返回响应,使用 Django 类视图(Class-Based Views)。每个视图类对应一个 API 端点,通过装饰器实现登录验证、权限检查和操作日志记录。

设计原则

  • 使用类视图(继承 View
  • 通过 @method_decorator(check_login) 验证登录
  • 通过 PermissionRequired mixin 检查权限
  • 通过 @operation_log 记录操作日志
  • 写操作检查 DJANGO_DEMO 演示模式

完整示例

以案例模块为例,application/example/views.py

python
from django.utils.decorators import method_decorator
from django.views import View
from application.example import services
from config.env import DJANGO_DEMO
from middleware.login_middleware import check_login
from middleware.permission_middleware import PermissionRequired
from utils import R
from application.operation_log.constants import LogType
from application.operation_log.decorators import operation_log


# =============================================================
# 分页查询视图
# =============================================================

@method_decorator(check_login, name="get")
class ExamplePageView(PermissionRequired, View):
    """案例分页数据查询视图"""
    permission_required = ("sys:example:page",)

    @operation_log(title="案例管理-查询分页列表", log_type=LogType.QUERY)
    def get(self, request):
        result = services.get_example_page(request)
        return result


# =============================================================
# 详情查询视图
# =============================================================

@method_decorator(check_login, name="get")
class ExampleDetailView(PermissionRequired, View):
    """案例详情查询视图"""
    permission_required = ("sys:example:detail",)

    @operation_log(title="案例管理-查询记录详情", log_type=LogType.QUERY)
    def get(self, request, id):
        data = services.get_example_detail(id)
        return R.ok(data=data)


# =============================================================
# 添加视图
# =============================================================

@method_decorator(check_login, name="post")
class ExampleAddView(PermissionRequired, View):
    """添加案例视图"""
    permission_required = ("sys:example:add",)

    @operation_log(title="案例管理-添加记录", log_type=LogType.ADD)
    def post(self, request):
        # 演示环境禁止操作
        if DJANGO_DEMO:
            return R.failed("演示环境,暂无操作权限")

        result = services.add_example(request)
        return result


# =============================================================
# 更新视图
# =============================================================

@method_decorator(check_login, name="put")
class ExampleUpdateView(PermissionRequired, View):
    """更新案例视图"""
    permission_required = ('sys:example:update',)

    @operation_log(title="案例管理-更新记录", log_type=LogType.UPDATE)
    def put(self, request):
        # 演示环境禁止操作
        if DJANGO_DEMO:
            return R.failed("演示环境,暂无操作权限")

        result = services.update_example(request)
        return result


# =============================================================
# 删除视图(支持批量)
# =============================================================

@method_decorator(check_login, name="delete")
class ExampleDeleteView(PermissionRequired, View):
    """删除案例视图"""
    permission_required = ('sys:example:delete',)

    @operation_log(title="案例管理-删除记录", log_type=LogType.DELETE)
    def delete(self, request, id):
        # 演示环境禁止操作
        if DJANGO_DEMO:
            return R.failed("演示环境,暂无操作权限")

        result = services.delete_examples(id)
        return result


# =============================================================
# 状态更新视图
# =============================================================

@method_decorator(check_login, name="put")
class ExampleStatusView(PermissionRequired, View):
    """设置案例状态视图"""
    permission_required = ('sys:example:status',)

    def put(self, request):
        # 演示环境禁止操作
        if DJANGO_DEMO:
            return R.failed("演示环境,暂无操作权限")

        result = services.update_example_status(request)
        return result

装饰器说明

@method_decorator(check_login)

验证 JWT 登录状态,从 Authorization: Bearer <token> 头解析用户信息。未登录返回 401。

python
@method_decorator(check_login, name="get")  # 验证 GET 请求
@method_decorator(check_login, name="post") # 验证 POST 请求
@method_decorator(check_login, name="put")  # 验证 PUT 请求
@method_decorator(check_login, name="delete") # 验证 DELETE 请求

PermissionRequired

权限检查 mixin,用户 ID 为 1 的超级管理员自动跳过权限检查。

python
class ExamplePageView(PermissionRequired, View):
    permission_required = ("sys:example:page",)  # 权限标识

@operation_log

操作日志记录装饰器,自动记录请求参数、响应结果、执行时间等。

python
@operation_log(title="案例管理-添加记录", log_type=LogType.ADD)

日志类型:

类型说明
LogType.QUERY查询操作
LogType.ADD添加操作
LogType.UPDATE更新操作
LogType.DELETE删除操作

演示模式检查

写操作(add/update/delete/status)需检查 DJANGO_DEMO 配置:

python
if DJANGO_DEMO:
    return R.failed("演示环境,暂无操作权限")

权限标识规范

操作权限标识说明
分页查询sys:{module}:page查询分页数据
列表查询sys:{module}:list查询列表数据
详情查询sys:{module}:detail查询单条详情
添加sys:{module}:add添加记录
更新sys:{module}:update更新记录
删除sys:{module}:delete删除记录
状态sys:{module}:status更新状态

View 层职责

View 层只负责:

  1. 接收 HTTP 请求
  2. 调用 Service 层函数
  3. 返回 R 响应

禁止在 View 层直接操作数据库或编写业务逻辑。

总结

View 层使用 Django 类视图,通过装饰器实现登录验证(check_login)、权限检查(PermissionRequired)和操作日志记录(operation_log)。写操作检查 DJANGO_DEMO 演示模式。View 层只负责请求分发和响应返回,业务逻辑集中在 Service 层。

小蚂蚁云团队 · 提供技术支持