使用Python实现简易的用户登录验证功能

简介: 这篇文章将向你展示如何使用Python语言进行程序设计,实现一个简易的用户登录验证功能。该功能允许用户输入由字母和数字任意组合而成的用户名和密码,并通过while循环不断地提示用户输入,直到凭证正确为止。所有凭证信息将被存储在一个字典中,以便进行匹配验证。

这篇文章将向你展示如何使用Python语言进行程序设计,实现一个简易的用户登录验证功能。

该功能允许用户输入由字母和数字任意组合而成的用户名和密码,并通过while循环不断地提示用户输入,直到凭证正确为止。所有凭证信息将被存储在一个字典中,以便进行匹配验证。

另外,引入了验证码机制,要求用户输入一个由0至9随机组成的四位数。无论登录尝试成功与否,此程序都会立即给出反馈,确保用户能够及时了解自己的登录状态。

用户登录验证的逻辑流程图

1716982007539.jpg

源码

import random
# 数据库模拟,字典存放用户信息
users_db = {
    "user-a": "123password",
    "user-b": "456password",
    "user-c": "789password"
}
# 该字典用于存放各个用户登录密码错误的次数
login_count = {}
def generate_captcha():
    """生成四位数字的验证码"""
    return str(random.randint(1000, 9999))
"""
# 生成四位数验证码的另一种思路
def generate_verification_code():
    return ''.join([str(random.randint(0, 9)) for _ in range(4)])
"""
def verify_captcha(captcha_input, captcha_actual):
    """验证用户输入的验证码是否正确"""
    return captcha_input == captcha_actual
def user_login():
    while True:
        """输入用户登录信息"""
        username = input("请输入用户名:")
        password = input("请输入密码:")
        # 生成验证码
        captcha = generate_captcha()
        print(f"验证码是:{captcha}")
        captcha_input = input("请输入验证码:")
        # 用户名验证
        if username in users_db:
            # 验证码验证
            if not verify_captcha(captcha_input, captcha):
                print("验证码错误!")
                continue
            # 密码验证
            if users_db[username] == password:
                print("登录成功!")
                break  # 登录成功,退出循环
            else:# 密码错误次数记录与锁定账号
                if username in login_count:
                    login_count[username] += 1
                else:
                    login_count[username] = 1
                
                if login_count[username] >= 3:
                    print("密码错误次数过多,账号已被锁定!")
                    break  # 输错三次密码,锁定账号,退出循环
                else:
                    print("密码错误!请重新输入!")
        else:
            print("用户名不存在,请重新输入!")
if __name__ == "__main__":
    user_login()

运行结果


代码分析

一、字典存放用户信息

字典是一种可变的容器模型,且可存储任意类型对象,用 { } 标识。字典是一个无序的键(key)值(value)对的集合。类似于,json对象存储格式

dic = {keyl = valuel, key2 = value2}

二、验证码生成函数

def generate_captcha():
    """生成四位数字的验证码"""
    return str(random.randint(1000, 9999))

该函数的目的是生成一个四位数字的验证码。这个验证码是由随机生成的四位数组成,范围从1000到9999。

具体来说,代码的工作流程如下:

  1. random.randint(1000, 9999):这行代码使用 random 模块的 randint 函数来生成一个位于1000和9999之间的随机整数,包括1000和9999。这意味着生成的验证码将是一个四位数。
  2. str(...):这个函数将生成的整数转换成字符串形式。因为验证码通常需要是字符串格式。
# 生成四位数验证码的另一种思路
def generate_verification_code():
    return ''.join([str(random.randint(0, 9)) for _ in range(4)])

这个函数generate_verification_code的目的是生成一个四位数的随机验证码。这个验证码由0到9的数字组成,每个数字都是随机选择的。


让我们分解这个函数来看它是如何工作的:

  1. random.randint(0, 9):这个表达式会生成一个0到9(包括0和9)之间的随机整数。random是Python的标准库中的一个模块,它提供了生成随机数的函数。randint是random模块中的一个函数,用于生成一个指定范围内的随机整数。
  2. [str(random.randint(0, 9)) for _ in range(4)]:这是一个列表推导式,它将执行四次random.randint(0, 9)操作,生成四个随机数字。str()函数用于将每个生成的数字转换为字符串,因为我们需要的是字符串形式的数字,以便稍后可以连接成一个四位的字符串。
  3. ''join(...):join是字符串的一个方法,它将列表中的所有元素连接成一个单一的字符串。在这个例子中,它将四个随机生成的字符串数字连接成一个四位的字符串。


每次调用generate_verification_code函数时,它都会返回一个不同的四位随机验证码字符串。这个验证码可以用作登录验证的一部分,以确保尝试登录的用户是人类而不是自动化脚本。

三、格式化字符串字面量

在Python中,f-string是一种字符串字面量,它允许在字符串中嵌入表达式,并使用大括号{}来引用变量或者表达式。这种方式在Python 3.6及以上版本中可用,是一种非常方便和简洁的字符串格式化方法。

# 生成验证码
captcha = generate_captcha()
print(f"验证码是:{captcha}")
captcha_input = input("请输入验证码:")

这行代码print(f"验证码:{verification_code}")的作用是将变量verification_code的值嵌入到字符串中,并将其打印出来。这里的f表示这是一个格式化字符串,而{verification_code}告诉Python在这个位置插入verification_code变量的值。


当这行代码执行时,它会生成一个包含随机生成的验证码的字符串,并输出到控制台。

四、"main"函数与程序入口

对于很多编程语言来说,程序都必须要有一个入口,比如C,C++,以及完全面向对象的编程语言Java,C#等。


如果你接触过这些语言,对于程序入口这个概念应该很好理解,C,C++都需要有一个main函数作为程序的入口,也就是程序的运行会从main函数开始。同样,Java,C#必须要有一个包含Main方法的主类,作为程序入口。


而Python则不同,它属于解释型脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。


一个Python源码文件(.py)除了可以被直接运行外,还可以作为模块(也就是库),被其他.py文件导入。不管是直接运行还是被导入,.py文件的最顶层代码都会被运行(Python用缩进来区分代码层次),而当一个.py文件作为模块被导入时,我们可能不希望一部分代码被运行。


所以,在Python中,if __name__ == "__main__":是一个常见的结构,用于确定模块是被直接运行还是被导入到另一个模块中。这里的__name__是Python的一个内置变量,它代表了当前模块的名称。


  • 当一个模块被直接运行时,__name__的值会被设置为"__main__"。

  • 当一个模块被导入到另一个模块中时,__name__的值会被设置为该模块的名称。


因此,if __name__ == "__main__":块中的代码只有在模块被直接运行时才会执行。这通常用于定义主程序入口点,即当模块作为脚本运行时应该执行的操作。

if __name__ == "__main__":
    user_login()

这段代码意味着如果这个模块是作为主程序运行的,那么user_login()函数将被调用。这通常用于编写可复用的代码,既可以作为库导入到其他项目中,也可以作为独立的脚本运行。


例如,假设有一个名为my_module.py的文件,内容如下:

def user_login():
    print("User logged in!")
if __name__ == "__main__":
    user_login()

如果直接运行my_module.py,输出将会是:

User logged in!

但如果在其他模块中导入my_module,user_login()函数不会被自动调用:

import my_module
# 这不会打印 "User logged in!",因为 my_module 被导入而不是直接运行

这种结构是Python中常见的程序入口点定义方式,它允许模块的行为根据其是被直接运行还是被导入而有所不同。

相关文章
|
7天前
|
程序员 Python
【随手记】python中各类下划线的作用与功能
【随手记】python中各类下划线的作用与功能
27 0
|
2天前
|
Python
Python的`os`模块核心功能概述:通过`os.getcwd()`获取
【6月更文挑战第23天】Python的`os`模块核心功能概述:通过`os.getcwd()`获取、`os.chdir()`改变工作目录;使用`os.mkdir()`, `os.makedirs()`创建目录,`os.rmdir()`, `os.removedirs()`删除;`os.rename()`, `os.renames()`重命名文件或目录;`os.remove()`删除文件;`os.listdir()`列出目录内容;`os.path.exists()`, `os.path.isfile()`, `os.path.isdir()`检查路径;`os.stat()`获取文件属性。
12 4
|
5天前
|
数据安全/隐私保护 Python
Python装饰器是高阶函数,用于在不修改代码的情况下扩展或修改函数行为。它们提供可重用性、模块化和无侵入性的功能增强。
【6月更文挑战第20天】Python装饰器是高阶函数,用于在不修改代码的情况下扩展或修改函数行为。它们提供可重用性、模块化和无侵入性的功能增强。例如,`@simple_decorator` 包装`my_function`,在调用前后添加额外操作。装饰器还能接受参数,如`@logged("INFO", "msg")`,允许动态定制功能。
15 6
|
6天前
|
存储 缓存 Linux
Python pip常用功能说明
pip 是 Python 的一个包管理工具,可以让用户方便地下载和安装 Python 包。pip 可以从 PyPI (Python Package Index) 上下载这些包,并且自动处理依赖关系。PyPI 是一个存储着 Python 包的仓库,用户可以从这个仓库中搜索、下载和安装 Python 包。在使用 pip 安装 Python 包时,由于 PyPI 的服务器位于国外,下载速度可能比较慢,因此我们可以使用国内的镜像源来提高下载速度。常见的国内镜像源有阿里云、清华大学等。
12 6
|
15天前
|
IDE 测试技术 持续交付
Python作为一种简洁、易读且功能强大的编程语言,其自动化测试和单元测试框架的丰富性和易用性为开发者提供了极大的便利
【6月更文挑战第10天】本文探讨了Python自动化测试与单元测试框架在提升代码质量和效率中的作用。Selenium、Appium和pytest是常用的自动化测试框架,分别支持Web和移动应用的测试。unittest是Python的标准单元测试框架,提供断言方法和测试组织结构。通过制定测试计划、编写高质量测试用例、持续集成与测试、以及有效利用测试报告,开发者能提高代码质量和开发效率。
27 1
|
4天前
|
缓存 数据库连接 开发者
Python中有哪些容易被忽视的核心功能
Python编程中,一些被忽视的核心功能包括:`argparse`库用于命令行参数解析,简化工具编写;使用`with`语句配合上下文管理器确保资源正确释放;列表推导式和生成器表达式创建列表和轻量级迭代;字典的`setdefault()`方法避免键不存在时的额外检查;默认参数值简化函数调用;`namedtuple`增加元组可读性;集合操作符执行并集、交集和差集;`lru_cache`缓存函数调用提高性能;`enumerate()`在迭代列表时同时访问索引和值;以及`Counter`统计元素频率。掌握这些功能可提升代码质量和效率。
|
4天前
|
JavaScript Python
Python if 的高级功能有哪些?
**Python 条件语句简介** `if` 用于检查变量是否为真,真值包括非零数、非空字符串、非空列表等。`if xxx:` 当 `xxx` 为真时执行代码块,否则跳过。`if xxx == xxx` 使用 `==` 比较值是否相等,`if xxx is xxx` 则检查是否为同一对象。
|
7天前
|
Python
Python实现用鼠标截图功能
Python实现用鼠标截图功能
8 0
|
12天前
|
机器学习/深度学习 算法 数据库
【功能超全】基于OpenCV车牌识别停车场管理系统软件开发【含python源码+PyqtUI界面+功能详解】-车牌识别python 深度学习实战项目
【功能超全】基于OpenCV车牌识别停车场管理系统软件开发【含python源码+PyqtUI界面+功能详解】-车牌识别python 深度学习实战项目
|
15天前
|
存储 算法 数据可视化
python多种算法对比图解实现 验证二叉树搜索树【力扣98】
python多种算法对比图解实现 验证二叉树搜索树【力扣98】