Python实现用户登录系统与三次错误锁定功能
1. 项目概述今天要分享一个非常实用的Python小项目——模拟用户登录系统并实现三次错误锁定功能。这个功能在实际应用中非常常见比如银行APP、企业OA系统等都会采用类似的机制来防止暴力破解。作为Python初学者实现这样一个功能不仅能巩固基础语法还能学习到文件操作、流程控制等核心知识点。这个项目的核心逻辑是用户有三次尝试登录的机会如果连续三次输入错误密码系统就会锁定该账号禁止再次尝试登录。锁定状态会持续到管理员手动解除在本例中通过删除黑名单文件实现。下面我会从零开始详细讲解每个实现步骤。2. 核心功能设计2.1 系统流程图整个登录系统的流程可以简化为以下几个关键步骤用户输入用户名系统检查用户名是否在黑名单中如果在黑名单中直接拒绝登录如果不在允许输入密码验证用户名和密码组合验证失败则记录尝试次数达到三次失败后将该用户加入黑名单2.2 数据结构设计我们需要两个核心数据存储正确的用户名和密码示例中硬编码为test/test黑名单用户列表存储在black_user文件中注意实际项目中绝对不要将密码明文存储这里仅为演示用途。生产环境应该使用密码哈希加盐存储。3. 代码实现详解3.1 基础框架搭建首先创建一个Python文件比如命名为login_system.py。我们先导入必要的模块并定义常量# -*- coding: utf-8 -*- MAX_ATTEMPTS 3 # 最大尝试次数 BLACKLIST_FILE black_user.txt # 黑名单文件名 CORRECT_USERNAME test # 正确用户名 CORRECT_PASSWORD test # 正确密码3.2 黑名单检查功能接下来实现检查用户是否在黑名单中的功能def is_user_locked(username): try: with open(BLACKLIST_FILE, r) as f: locked_users f.read().splitlines() return username in locked_users except FileNotFoundError: # 如果黑名单文件不存在视为没有锁定用户 return False这个函数会尝试打开黑名单文件读取所有被锁定的用户名每行一个检查输入的用户名是否在其中如果文件不存在自动创建空列表3.3 主登录逻辑下面是核心的登录验证逻辑def login(): username input(请输入用户名: ) if is_user_locked(username): print(账号已被锁定请联系管理员) return attempts 0 while attempts MAX_ATTEMPTS: password input(请输入密码: ) if username CORRECT_USERNAME and password CORRECT_PASSWORD: print(登录成功) return else: attempts 1 remaining MAX_ATTEMPTS - attempts if remaining 0: print(f用户名或密码错误还剩{remaining}次尝试机会) # 如果执行到这里说明三次都错了 with open(BLACKLIST_FILE, a) as f: f.write(f{username}\n) print(错误次数过多账号已被锁定)3.4 完整代码整合将以上部分组合起来并添加一些友好的交互提示def main(): print( 用户登录系统 ) while True: login() choice input(\n是否继续尝试(y/n): ) if choice.lower() ! y: break if __name__ __main__: main()4. 功能测试与验证4.1 正常登录场景运行程序输入正确的用户名(test)和密码(test)应该看到登录成功的提示4.2 错误密码场景运行程序输入正确的用户名(test)连续三次输入错误密码第三次错误后应该看到锁定提示再次尝试用同一用户名登录时应该直接提示账号锁定4.3 黑名单文件检查程序运行后会在同一目录下生成black_user.txt文件里面记录了被锁定的用户名。可以手动删除这个文件来解除锁定。5. 进阶改进建议5.1 密码隐藏输入当前版本输入密码时会明文显示不安全。可以使用getpass模块改进from getpass import getpass password getpass(请输入密码: )5.2 锁定时间限制当前锁定是永久的可以增加时间限制import time import json # 存储锁定时间和用户名 lock_data { username: test, lock_time: time.time() # 当前时间戳 } # 保存到文件 with open(lock_data.json, w) as f: json.dump(lock_data, f) # 检查是否超过锁定时间 def is_lock_expired(): try: with open(lock_data.json, r) as f: data json.load(f) return time.time() - data[lock_time] 3600 # 1小时 except FileNotFoundError: return True5.3 多用户支持目前只支持一个硬编码用户可以扩展为从文件或数据库读取用户数据# users.json { users: [ { username: test, password: test # 实际应该存储密码哈希 }, { username: admin, password: admin123 } ] }6. 常见问题排查6.1 文件权限问题如果在Linux/Mac上运行可能会遇到文件权限错误。解决方法chmod 644 black_user.txt6.2 中文编码问题如果用户名包含中文确保文件以UTF-8编码保存with open(BLACKLIST_FILE, a, encodingutf-8) as f: f.write(f{username}\n)6.3 跨平台兼容性Windows和Linux的换行符不同可以统一处理locked_users f.read().splitlines() # 自动处理不同换行符7. 项目扩展思路这个基础版本还可以进一步扩展添加密码强度检查实现密码重置功能增加验证码机制记录登录日志添加管理员解锁功能比如实现一个简单的解锁功能def unlock_user(): username input(输入要解锁的用户名: ) if not is_user_locked(username): print(该用户未被锁定) return with open(BLACKLIST_FILE, r) as f: users f.read().splitlines() users.remove(username) with open(BLACKLIST_FILE, w) as f: f.write(\n.join(users)) print(f用户 {username} 已解锁)8. 安全注意事项虽然这只是一个演示项目但有几个重要的安全原则需要注意永远不要明文存储密码 - 应该使用bcrypt等安全哈希算法黑名单文件应该放在非web可访问的目录考虑对登录尝试进行IP限制生产环境应该使用成熟的认证框架如Django的auth系统一个简单的密码哈希示例import bcrypt # 存储密码 password mypassword.encode(utf-8) hashed bcrypt.hashpw(password, bcrypt.gensalt()) # 验证密码 input_password mypassword.encode(utf-8) if bcrypt.checkpw(input_password, hashed): print(密码正确)9. 性能优化建议当用户量很大时当前的文本文件方案可能性能不佳。可以考虑使用SQLite数据库存储用户和黑名单实现缓存机制减少文件IO对频繁访问的数据保持内存缓存简单的SQLite实现示例import sqlite3 def init_db(): conn sqlite3.connect(auth.db) c conn.cursor() c.execute(CREATE TABLE IF NOT EXISTS users (username TEXT PRIMARY KEY, password TEXT)) c.execute(CREATE TABLE IF NOT EXISTS blacklist (username TEXT PRIMARY KEY, lock_time TIMESTAMP)) conn.commit() conn.close()10. 项目部署说明最后如果你想把这个小项目变成一个真正的服务可以考虑使用Flask/Django做成Web服务添加HTTPS支持配置Nginx反向代理实现会话管理一个最简单的Flask示例from flask import Flask, request, jsonify app Flask(__name__) app.route(/login, methods[POST]) def login(): data request.json username data.get(username) password data.get(password) # 这里添加验证逻辑 return jsonify({status: success}) if __name__ __main__: app.run()这个Python登录系统虽然简单但涵盖了很多实际开发中的核心概念。通过不断迭代和完善你可以把它发展成一个功能完备的认证系统。在实际开发中建议直接使用成熟的认证库但理解底层原理对成为更好的开发者至关重要。

相关新闻

Python编程从入门到精通:3个月系统学习路线与实践指南

Python编程从入门到精通:3个月系统学习路线与实践指南

1. Python学习路线规划作为一名从零开始学习Python的开发者,我花了三个月时间系统掌握了这门语言的核心要点。Python作为当前最流行的编程语言之一,其简洁的语法和丰富的生态使其成为入门编程的首选。不同于其他语言的陡峭学习曲线,Python更像…

2026/10/28 18:08:41 阅读更多 →
GHelper终极指南:免费轻量级华硕笔记本优化神器,5分钟告别臃肿控制中心

GHelper终极指南:免费轻量级华硕笔记本优化神器,5分钟告别臃肿控制中心

GHelper终极指南:免费轻量级华硕笔记本优化神器,5分钟告别臃肿控制中心 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, Pr…

2026/10/28 2:39:25 阅读更多 →
Android开发环境搭建与数据结构应用实战

Android开发环境搭建与数据结构应用实战

1. 实验背景与环境搭建这个数据结构综合应用实验需要我们在Android开发环境中完成,这意味着我们需要先搭建好Java开发环境和Android Studio工具链。作为一名长期从事移动开发的工程师,我深知环境配置中的各种坑,这里分享下我的实战经验。首先…

2026/10/23 19:41:40 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/28 7:28:00 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/28 9:02:11 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/28 9:00:54 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/28 7:29:02 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 16:58:40 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 9:01:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 19:19:37 阅读更多 →