推荐用captcha库生成动态图片验证码,文本存session并立即设置,/captcha路由返回PNG响应且禁用缓存,登录时严格比对并pop验证码,确保secret_key固定和同域请求。

Flask登录页怎么集成图形验证码(非第三方服务)
直接用 pytesseract 或 captcha 库生成动态图片验证码最可控,不依赖外部API,也不用配Redis存session。关键不是“能不能做”,而是验证码的文本必须和session对得上,且图片不能被缓存导致重复提交失败。
- 推荐用
captcha库:轻量、纯Python、支持中文需额外加字体文件,但英文登录场景够用 - 验证码文本必须存进
session,不能存在前端或URL参数里——否则绕过校验太容易 - 浏览器可能缓存
/captcha图片请求,要在响应头加Cache-Control: no-store - 生成图片后立即设置
session['captcha_text'],并在验证逻辑里比对前先pop()或设有效期(比如5分钟),防重放
Flask路由怎么写才能让验证码图实时刷新
单独开一个 /captcha 路由返回PNG图片,而不是把图片base64塞进HTML里——后者难调试、无法控制缓存、还拖慢页面加载。
- 路由函数返回
Response,mimetype='image/png',别用send_file(临时文件路径易出错) - 用
BytesIO在内存中构造图片流,避免磁盘I/O - 前端img标签的src写成
/captcha?t={{ now() }}或绑定点击事件动态改src,加时间戳防缓存 - 如果用AJAX换图,记得在success回调里更新img的src属性,不然浏览器可能复用旧缓存
登录表单提交时如何安全比对验证码
用户POST登录数据时,request.form.get('captcha') 和 session里存的值必须严格相等(区分大小写),且只比对一次。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 比对前先检查
session.get('captcha_text')是否存在,不存在就直接返回“验证码已失效” - 比对成功后立刻执行
session.pop('captcha_text', None),防止同一验证码被多次使用 - 不要在验证失败后清空整个session——这会导致用户填好的账号密码也丢了,影响体验
- 如果用WTForms,别把验证码字段加进Form类的
validate_on_submit()自动校验里,它不处理session状态,容易漏掉pop逻辑
为什么登录成功后验证码还显示“错误”?常见坑在哪
多数是session没同步或跨请求丢失,尤其在调试时开了多个浏览器标签、用了无痕模式、或者没配好secret_key。
-
app.secret_key必须设置,且不能每次启动都随机生成——否则session解密失败,session['captcha_text']读出来是None - Chrome无痕窗口、Firefox私密模式默认禁用第三方cookie,如果Flask跑在localhost但前端资源走127.0.0.1,可能因Samesite策略丢session
- Nginx反向代理时没透传
Cookie头,或没配proxy_cookie_path / /;,导致后端收不到session_id - 验证码图片请求(GET /captcha)和登录提交(POST /login)必须同域、同协议、同端口,否则浏览器不带cookie过去
验证码最难的部分不在生成图片,而在于确保session生命周期和HTTP请求链路完全对齐——少一个 pop(),多一个未设 secret_key,都可能让验证逻辑在某个边缘场景下静默失效。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










