captcha.verify()总返回false的主因是服务端验证时key与前端提交的不一致,常见于session未启用、redis与内存混用、跨域cookie配置不当(缺samesite=none; secure)、django的session_engine设为cache时读不到值、flask中手动操作session而非调用validate_captcha()等。

为什么 captcha.verify() 总返回 False?
不是验证码图片没生成对,而是服务端验证时用的 key 和前端提交的不一致——常见于 session 未启用、或用了不同 session backend(比如 Redis 和内存混用)。
-
captcha.generate()默认把答案存进当前请求的session,验证时也从同一session读;如果前后端走的是不同域名、或没带SameSite=None; Secure的 Cookie 配置,session就断了 - Django 用户注意:
SESSION_ENGINE设成django.contrib.sessions.backends.cache时,captcha可能读不到值,建议改用db或cached_db - Flask 用户别直接用
session['captcha_key']手动存取,flask-captcha内部用的是带前缀的键名,得走它自己的validate_captcha()函数
用 django-simple-captcha 时怎么绕过数据库查表?
默认每次验证都查一次 CaptchaStore 表,QPS 上去后容易成瓶颈;其实可以关掉自动清理 + 改用缓存存储答案。
- 在 settings.py 加上:
CAPTCHA_CACHE_PREFIX = "captcha:",并确保CACHES配置可用 - 设
CAPTCHA_GET_FROM_POOL = True启用预生成池,避免实时生成拖慢首屏 - 禁用自动清理:
CAPTCHA_AUTO_CLEAN = False,自己用定时任务清过期项,否则缓存里会越积越多 - 注意:
CAPTCHA_CACHE_TIMEOUT默认是 5 分钟,和前端倒计时要对齐,否则用户看到“还剩 10 秒”但后端已失效
Flask + flask-captcha 验证失败却不报错?
默认静默失败,只返回 False,连日志都不打——调试时根本不知道卡在哪一步。
韩顺平,毕业于清华大学,国内著名的软件培训高级讲师,先后在新浪、点击科技、用友就职。 主持或参与《新浪邮件系统》、《橙红sns(社会化网络)网站》、《点击科技协同软件群组服务器端(Linux/solaris平台)》、《国家总参语音监控系统》、《英语学习机系统》、《用友erp(u8产品)系统》等项目。实战经验丰富,授课耐心细致,通俗易懂,勇于实践,勤于创新,授课风格贴近生活,授课语言生动风趣,多年
- 调用
validate_captcha()前,先确认request.form.get('captcha')确实拿到了值,且没被中间件(如 CSRF 插件)误删 - 检查
captcha_id字段是否随表单一起提交,flask-captcha要求必须传这个 ID 才能定位对应答案 - 开启 debug 模式:
app.config['CAPTCHA_DEBUG'] = True,它会在 response headers 里写入X-Captcha-Debug: reason=xxx,比如reason=expired或reason=not_found - 别用
request.json提交验证码——该库只认form或args,JSON body 会被忽略
自建 CAPTCHA 服务时,imageio 和 PIL 图像生成差异在哪?
不用第三方包也能画图,但选错库会导致字体渲染异常、中文乱码、或 Docker 里跑不起来。
立即学习“Python免费学习笔记(深入)”;
-
PIL.ImageDraw.text()在无字体路径时会 fallback 到内置 bitmap 字体,不支持中文;必须显式传font=ImageFont.truetype("DejaVuSans.ttf", 16) -
imageio本身不处理文字,得配合numpy手动画像素,适合极简数字验证码,但维护成本高 - Docker 镜像记得装系统字体:
apt-get install -y fonts-dejavu,否则 PIL 找不到ttf文件,抛OSError: cannot open resource - 生成 GIF 动态验证码时,
PIL的save(..., save_all=True)容易内存暴涨,建议用imageio.mimsave()替代
最麻烦的其实是时间同步问题:服务端生成时用本地时间算过期,但负载均衡后各机器时钟差几秒,就可能导致刚生成的验证码立刻失效。NTP 校准不是可选项,是必选项。









