如何在Typer中禁用Traceback并隐藏敏感变量明文输出?
解决Typer生产环境异常Traceback与敏感变量泄露问题
1. 禁用全局Traceback输出
Typer基于Click框架,可通过两种方式关闭Traceback输出:
方法一:初始化应用时直接配置
创建Typer实例时,设置pretty_exceptions_show_traceback=False,生产环境下将不再打印冗长的Traceback信息:
import typer app = typer.Typer(pretty_exceptions_show_traceback=False) @app.command() def login(password: str): assert len(password) >= 8, "密码长度不符合要求" if __name__ == "__main__": app()
方法二:自定义全局异常处理器
如果需要更灵活的异常控制逻辑,可注册全局异常处理器,捕获所有异常后仅输出友好提示:
import typer from typer import Typer def custom_exception_handler(e: Exception): typer.echo(f"执行错误: {str(e)}", err=True) raise typer.Exit(code=1) app = Typer() app.register_exception_handler(Exception, custom_exception_handler) @app.command() def login(password: str): assert len(password) >= 8, "密码长度不符合要求" if __name__ == "__main__": app()
2. 隐藏敏感变量明文
方法一:标记敏感参数
Typer支持将参数标记为敏感,框架会自动对这类参数的值进行掩码处理,避免明文泄露:
import typer @app.command() def login(password: str = typer.Argument(..., sensitive=True)): assert len(password) >= 8, "密码长度不符合要求"
标记为sensitive=True后,即便出现意外的变量打印场景,Typer会自动用***替换敏感值。
方法二:避免在异常信息中直接引用敏感变量
不要在断言或异常消息中直接拼接敏感变量,改用通用提示:
# 错误写法(会泄露明文) # assert len(password) >=8, f"密码 {password} 长度不足" # 正确写法 assert len(password) >=8, "密码长度不足,请输入至少8位字符"
方法三:自定义敏感异常类
针对涉及敏感数据的场景,可自定义异常类,确保抛出的异常信息中不包含敏感内容:
class SensitiveOperationException(Exception): def __init__(self, msg: str): super().__init__(msg) @app.command() def login(password: str): try: if len(password) < 8: raise SensitiveOperationException("密码长度不符合要求") except SensitiveOperationException as e: typer.echo(f"错误: {str(e)}", err=True) raise typer.Exit(code=1)
3. 生产环境额外注意事项
- 确保生产环境未开启Typer的调试模式(
debug参数默认值为False,不要手动设置为True) - 可设置环境变量
PYTHONUNBUFFERED=1,避免缓存输出导致的异常信息泄露风险
内容的提问来源于stack exchange,提问作者ntg
相关产品推荐
相关产品推荐

