Become a sponsor

演示模式
演示模式用于在线体验环境,开启后所有写操作(新增、编辑、删除等)将被拦截,返回"演示环境,暂无操作权限"提示。通过 FASTAPI_DEMO 环境变量控制。装饰器位于 src/core/access_decorators.py。
| 环境变量 | 默认值 | 说明 |
|---|---|---|
FASTAPI_DEMO | False | 是否开启演示模式 |
# .env
# 开启演示模式
FASTAPI_DEMO=True
# 关闭演示模式(生产环境)
FASTAPI_DEMO=Falsesrc/core/access_decorators.py 中的 @check_demo 装饰器用于拦截写操作:
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)装饰器实现:
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 之后:
# 正确顺序
@router.post('/add')
@permission_required("sys:level:add") # 先校验权限
@check_demo # 再检查演示模式
async def add(request: Request, data: LevelForm):
...顺序重要
如果 @check_demo 放在 @permission_required 之前,权限校验会被跳过,可能导致安全问题。
演示模式下万能验证码 618618 可绕过正常验证码校验,方便演示环境登录:
# 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. 只读体验:查询操作不受影响,用户可正常浏览数据