<div class="postBody">
<div id="cnblogs_post_body">
Python生成随机验证码,需要使用PIL模块.python3则是pillow
安装:
Highlighter sh-gutter">
基本使用
1. 创建图片
2. 创建画笔,用于在图片上画任意内容
4. 画线
6. 写文本
Highlighter sh-gutter">
7. 特殊字体文字
图片验证码
Highlighter sh-gutter">

PIL io
img </span>= Image.new(mode=<span style="color: #800000;">'</span><span style="color: #800000;">RGB</span><span style="color: #800000;">'</span>,size=(120,40<span style="color: #000000;">),color</span>=(random.randint(0,255),random.randint(0,255<span style="color: #000000;">)))
draw </span>= ImageDraw.Draw(img,<span style="color: #800000;">'</span><span style="color: #800000;">RGB</span><span style="color: #800000;">'</span><span style="color: #000000;">)
font </span>= ImageFont.truetype(<span style="color: #800000;">'</span><span style="color: #800000;">app01/static/font/kumo.ttf</span><span style="color: #800000;">'</span>,25<span style="color: #000000;">)
valid_list </span>=<span style="color: #000000;"> []
</span><span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> range(5<span style="color: #000000;">):
random_num </span>= str(random.randint(0,9<span style="color: #000000;">))
random_upper_alp </span>= chr(random.randint(65,90<span style="color: #000000;">))
random_lower_alp </span>= chr(random.randint(97,122<span style="color: #000000;">))
valid_ele </span>=<span style="color: #000000;"> random.choice([random_num,random_upper_alp,random_lower_alp])
valid_list.append(valid_ele)
draw.text([</span>5 + i * 24,10],valid_ele,(random.randint(0,255<span style="color: #000000;">)),font</span>=<span style="color: #000000;">font)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 写干扰点</span>
<span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> range(40<span style="color: #000000;">):
draw.point([random.randint(0,</span>120),40<span style="color: #000000;">)],fill</span>=(random.randint(0,random.randint(10,random.randint(64,255<span style="color: #000000;">)))
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 写干扰圆圈</span>
<span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> range(40<span style="color: #000000;">):
draw.point([random.randint(0,255<span style="color: #000000;">)))
x </span>= random.randint(0,120<span style="color: #000000;">)
y </span>= random.randint(0,40<span style="color: #000000;">)
draw.arc((x,x </span>+ 4,y + 4),90<span style="color: #000000;">,255<span style="color: #000000;">)))
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 画干扰线</span>
<span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> range(5<span style="color: #000000;">):
x1 </span>= random.randint(0,120<span style="color: #000000;">)
y1 </span>= random.randint(0,40<span style="color: #000000;">)
x2 </span>= random.randint(0,120<span style="color: #000000;">)
y2 </span>= random.randint(0,40<span style="color: #000000;">)
draw.line((x1,255<span style="color: #000000;">)))
f </span>=<span style="color: #000000;"> BytesIO()
img.save(f,</span><span style="color: #800000;">'</span><span style="color: #800000;">png</span><span style="color: #800000;">'</span><span style="color: #000000;">)
data </span>=<span style="color: #000000;"> f.getvalue()
valid_str </span>= <span style="color: #800000;">''</span>.join(valid_list) <span style="color: #008000;">#</span><span style="color: #008000;">将验证码拼接成字符串</span>
<span style="color: #0000ff;">print</span><span style="color: #000000;">(valid_str)
request.session[</span><span style="color: #800000;">"</span><span style="color: #800000;">keepValidCode</span><span style="color: #800000;">"</span>] = valid_str <span style="color: #008000;">#</span><span style="color: #008000;">将验证码保存在session中,方便在登陆时验证</span>
<span style="color: #0000ff;">return</span> HttpResponse(data)</pre>

app01 django.contrib.auth
request.method == = render(request,,{== LoginForm(data== request.POST.get(
</span><span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span><span style="color: #000000;"> form.is_valid():
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> HttpResponse(json.dumps(dict(form.errors)))
</span><span style="color: #0000ff;">if</span> validcode.upper() != request.session[<span style="color: #800000;">"</span><span style="color: #800000;">keepValidCode</span><span style="color: #800000;">"</span><span style="color: #000000;">].upper():
</span><span style="color: #0000ff;">return</span> HttpResponse(json.dumps(<span style="color: #800000;">'</span><span style="color: #800000;">codeError</span><span style="color: #800000;">'</span><span style="color: #000000;">))
user </span>= authenticate(**<span style="color: #000000;">form.cleaned_data)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> user=models.UserInfo.objects.filter(**form.cleaned_data)</span>
<span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span><span style="color: #000000;"> user:
</span><span style="color: #0000ff;">return</span> HttpResponse(json.dumps({<span style="color: #800000;">'</span><span style="color: #800000;">flag</span><span style="color: #800000;">'</span>: False,<span style="color: #800000;">'</span><span style="color: #800000;">msg</span><span style="color: #800000;">'</span>: <span style="color: #800000;">"</span><span style="color: #800000;">用户名或者密码错误</span><span style="color: #800000;">"</span><span style="color: #000000;">}))
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
login(request,user) </span><span style="color: #008000;">#</span><span style="color: #008000;">设置session </span>
<span style="color: #0000ff;">return</span> HttpResponse(json.dumps({<span style="color: #800000;">'</span><span style="color: #800000;">flag</span><span style="color: #800000;">'</span>: True}))</pre>
img中src实现局部刷新验证码的功能
html部分: