Skip to content

演示模式

演示模式用于在线体验环境,开启后所有写操作(新增、编辑、删除等)将被拦截,返回"演示环境,暂无操作权限"提示。通过 FASTAPI_DEMO 环境变量控制。装饰器位于 src/core/access_decorators.py

配置项

环境变量默认值说明
FASTAPI_DEMOFalse是否开启演示模式
bash
# .env

# 开启演示模式
FASTAPI_DEMO=True

# 关闭演示模式(生产环境)
FASTAPI_DEMO=False

check_demo 装饰器

src/core/access_decorators.py 中的 @check_demo 装饰器用于拦截写操作:

python
from core.access_decorators import check_demo

@router.post('/add')
@permission_required("sys:level:add")
@check_demo
async def add(request: Request, data: LevelForm):
    return await level.LevelAdd(request, data)

装饰器实现:

python
def check_demo(func):
    """演示模式拦截装饰器,放在 @permission_required 之后、路由函数之前"""
    if asyncio.iscoroutinefunction(func):
        @wraps(func)
        async def async_wrapper(*args, **kwargs):
            if FASTAPI_DEMO:
                return R.failed("演示环境,暂无操作权限")
            return await func(*args, **kwargs)
        return async_wrapper

    @wraps(func)
    def sync_wrapper(*args, **kwargs):
        if FASTAPI_DEMO:
            return R.failed("演示环境,暂无操作权限")
        return func(*args, **kwargs)
    return sync_wrapper

装饰器顺序

@check_demo 必须放在 @permission_required 之后:

python
# 正确顺序
@router.post('/add')
@permission_required("sys:level:add")  # 先校验权限
@check_demo                             # 再检查演示模式
async def add(request: Request, data: LevelForm):
    ...

顺序重要

如果 @check_demo 放在 @permission_required 之前,权限校验会被跳过,可能导致安全问题。

万能验证码

演示模式下万能验证码 618618 可绕过正常验证码校验,方便演示环境登录:

python
# src/utils/captcha.py
async def verify_captcha(key: str, code: str) -> bool:
    # 演示模式下检查万能验证码
    if FASTAPI_DEMO and code == CAPTCHA_BYPASS_CODE:
        return True
    # 正常校验逻辑...

适用场景

1. 在线体验:让用户无需注册即可体验系统功能
2. 演示环境:销售或产品演示时防止误操作
3. 公开测试:开放测试环境但保护数据安全

受保护的操作

演示模式拦截以下操作(带 @check_demo 装饰器的端点):

- 新增(add)
- 编辑(update)
- 删除(delete / batchDelete)
- 状态设置(status)
- 重置密码(resetPwd)
- 导入(import)
- 授权(auth)
- 生成代码(generate)

不受影响的操作:

- 登录(login)
- 获取验证码(captcha)
- 查询列表(list)
- 查询详情(detail)
- 导出(export)

总结

演示模式具备以下特点:

1. 环境变量控制:FASTAPI_DEMO=True 开启,False 关闭
2. 写操作拦截:@check_demo 装饰器拦截所有写操作
3. 万能验证码:演示模式下可用,方便登录体验
4. 安全顺序:必须放在 @permission_required 之后
5. 只读体验:查询操作不受影响,用户可正常浏览数据

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