/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
1. Python 图片验证码库核心选型指南
验证码作为现代Web应用的基础安全组件,其重要性不言而喻。Python生态中有多个成熟的验证码生成库,每个都有其特定的适用场景和技术特点。以下是经过实战检验的四大主流选择:
1.1 captcha库:轻量级首选方案
这个纯Python实现的库最大的优势是零外部依赖。安装只需一行命令:
pip install captcha
生成数字验证码的典型代码如下:
from captcha.image import ImageCaptcha
image = ImageCaptcha(width=300, height=100)
data = image.generate(\’1234\’)
image.write(\’1234\’, \’captcha.png\’)
实际项目中我建议调整这些参数:
- width/height:根据前端展示需求调整
- fonts:务必指定多个字体文件路径列表
- font_sizes:控制字符大小波动范围增强安全性
重要提示:默认字体可能显示异常,建议通过fonts参数指定系统存在的TTF字体文件
1.2 django-simple-captcha:Django生态标配
作为Django专属解决方案,其特色在于:
安装配置流程:
pip install django-simple-captcha
然后在settings.py添加:
INSTALLED_APPS = [
…
\’captcha\’,
]
生成表单时直接使用CaptchaField:
from captcha.fields import CaptchaField
class ContactForm(forms.Form):
captcha = CaptchaField()
1.3 Pillow方案:深度定制之选
当需要实现特殊效果时,可以直接使用Pillow进行底层操作。以下是生成带干扰线的验证码示例:
from PIL import Image, ImageDraw, ImageFont
import random
def generate_captcha(text):
image = Image.new(\’RGB\’, (200, 100), color=(255, 255, 255))
draw = ImageDraw.Draw(image)
# 加载字体
try:
font = ImageFont.truetype(\’arial.ttf\’, 36)
except:
font = ImageFont.load_default()
# 绘制文本
draw.text((10, 30), text, font=font, fill=(0, 0, 0))
# 添加干扰线
for _ in range(5):
x1 = random.randint(0, 200)
y1 = random.randint(0, 100)
x2 = random.randint(0, 200)
y2 = random.randint(0, 100)
draw.line([(x1, y1), (x2, y2)], fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)), width=2)
return image
1.4 商业API方案对比
对于高安全要求的场景,可以考虑以下商业方案:
| 腾讯云验证码 | 1000次/月 | 99.8% | 按量付费 | 行为式验证、无感验证 |
| 阿里云验证码 | 500次/月 | 99.5% | 套餐包 | 滑动拼图、智能风险控制 |
| Geetest |





![[鼎捷 E10] 财务相关单据操作时异常问题解决(一)-171主机测评](https://www.171host.com/wp-content/uploads/2026/10/20261030154444-6ae4bb6c483bc-220x150.png)
