You need to enable JavaScript to run this app. 如何使用Click的上下文与回调限制用户登录尝试次数
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 13:54:05