如何使用Click的上下文与回调限制用户登录尝试次数
Click CLI工具限制密码尝试次数实现方案
你可以借助Click上下文(ctx)内置的meta字典存储尝试次数计数器,这个字段是框架预留的自定义数据存储位,命令执行全程共享不会被重置,配合两种不同的异常类型控制流程:密码错误且未达尝试上限时抛出BadParameter触发重新输入,达到上限时抛出Abort直接终止程序。
以下是完整可运行的实现代码:
import click # 自定义最大尝试次数 MAX_LOGIN_ATTEMPTS = 3 def validate_password(ctx, param, password): """密码校验+尝试次数控制逻辑""" # 从上下文获取已尝试次数,默认值为0 current_attempt = ctx.meta.get("login_attempt_count", 0) current_attempt += 1 # 回写最新次数到上下文 ctx.meta["login_attempt_count"] = current_attempt # -------------------------- # 此处替换为你自己的密码校验逻辑:比如哈希比对、格式校验等 CORRECT_PASSWORD = "test123" if password == CORRECT_PASSWORD: return password # -------------------------- # 校验失败的分支处理 if current_attempt >= MAX_LOGIN_ATTEMPTS: click.echo("登录尝试次数已达上限,程序退出") raise click.Abort() # 未达上限时抛出参数错误,触发Click重新提示输入密码 raise click.BadParameter(f"密码错误,剩余尝试次数:{MAX_LOGIN_ATTEMPTS - current_attempt}") @click.command() @click.password_option(confirmation_prompt=False, callback=validate_password) def log_admin(password): click.echo("Successful authentication.") if __name__ == "__main__": log_admin()
逻辑说明:
- 每次用户输入密码后都会触发回调,计数器自动累加1
- 密码校验通过后直接返回密码值,进入命令主逻辑
- 校验失败时如果没到次数上限,
BadParameter异常会让Click自动重新弹出密码输入提示,同时展示剩余次数 - 达到上限时直接终止程序,不再接受输入
内容的提问来源于stack exchange,提问作者Nathan Furnal
相关产品推荐
相关产品推荐

