django模板-实现图文验证码两种方式

主路由urls.py:

1 from django.contrib import admin
2 from django.urls import path
3 from django.conf.urls import url,include
4 
5 urlpatterns = [
6     path('admin/', admin.site.urls),
7     url(r'^booktest/',include(('booktest.urls','booktest'),namespace='booktest')),
8     path('captcha/',include('captcha.urls')),  #为了使用captcha验证码配置此路由
9 ]

项目路由urls.py:

 1 from django.conf.urls import url,include
 2 from . import views
 3 
 4 urlpatterns = [
 5     url(r'^verifyCode$',views.verifyCode),
 6     url(r'^verifyTest1$',views.verifyTest1),
 7     url(r'^verifyTest2$',views.verifyTest2),
 8     url(r'^verifyTest3$',views.verifyTest3),
 9     url(r'^verifyTest4$',views.verifyTest4),
10 ]

 

第一种方法:自己创建图文验证码

views.py

 1 #--------------------自己创建图文验证码--------------------
 2 #自己创建验证码
 3 def verifyCode(request):
 4     from PIL import Image,ImageDraw,ImageFont
 5     import random
 6     #创建背景色
 7     bgColor=(random.randrange(50,100),random.randrange(50,100),0)
 8     #规定宽高
 9     width=100
10     height=25
11     #创建画布
12     image=Image.new('RGB',(width,height),bgColor)
13     #构造字体对象
14     font=ImageFont.truetype('simkai.ttf',24)    #在Windows环境,字体一般位于C:\WINDOWS\Fonts文件夹下
15     #创建画笔
16     draw=ImageDraw.Draw(image)
17     #创建文本内容
18     text='1234ABCD'
19     #逐个绘制文字:
20     textTemp=''
21     for i in range(4):
22         textTemp1=text[random.randrange(0,len(text))]
23         textTemp+=textTemp1
24         draw.text((i*18,0),textTemp1,(255,255,255),font)
25     #将验证码存至session
26     request.session['code']=textTemp
27     #保存至内存流中
28     import io
29     buf=io.BytesIO()
30     image.save(buf,'png')
31     #将内存流中的内容输出至客户端
32     return HttpResponse(buf.getvalue(),'image/png')    #这里是重点,MIME类型为图片png
33 
34 #验证码表单页
35 def verifyTest1(request):
36     return render(request,'booktest/verifyTest1.html')
37 
38 #判断验证码是否正确,将验证码的数据其实是存储到session中通过session和前端获取的值进行比较
39 def verifyTest2(request):
40     code1=request.POST['code']
41     code2=request.session['code']
42     if code1==code2:
43         return HttpResponse('ok')
44     else:
45         return HttpResponse('no')
verifyTest1.html
 1 <!doctype html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport"
 6           content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
 7     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 8     <title>verifyTest1</title>
 9 </head>
10 <body>
11     <form action="verifyTest2" method="post">
12         {% csrf_token %}
13         <input type="text" name="code">
14         <img src="verifyCode" alt="verifyCode">
15         <input type="submit" value="提交">
16     </form>
17 </body>
18 </html>

 

 

第二种方法:使用第三方captcha验证码

views.py

 1 #--------------------使用第三方captcha验证码--------------------
 2 '''
 3 第一步:安装包pip install django-simple-captcha
 4 第二步:在setting.py中INSTALLED_APPS添加“captcha”这个app
 5 第三步:在主路由urls.py配置captcha应用的路由,path('captcha/',include('captcha.urls'))
 6 第四步:迁移同步,更新数据库,生成captcha所依赖的表,执行makemigrations和migrate
 7 然后如下步骤:
 8 '''
 9 
10 from captcha.fields import CaptchaField
11 from django import forms
12 
13 # 创建一个表单的类,这里的captcha = CaptchaField()就是使用了captcha这个插件了
14 class RegisterForm(forms.Form):
15     captcha = CaptchaField()
16 
17 #验证码表单页
18 def verifyTest3(request):
19     context={'code':RegisterForm()}   #RegisterForm()实例化表单
20     return render(request,'booktest/verifyTest3.html',context)
21 
22 #判断验证码是否正确
23 def verifyTest4(request):
24     register_form = RegisterForm(request.POST)  #这里必须添加request.POST来获取提交的表单数据
25 
26     if register_form.is_valid():    #is_valid()用来判断是否返回值
27         return HttpResponse('ok')
28     else:
29         return HttpResponse('no')
verifyTest3.html
 1 <!doctype html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport"
 6           content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
 7     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 8     <title>verifyTest3</title>
 9 </head>
10 <body>
11     <form action="verifyTest4" method="post">
12         {% csrf_token %}
13         {{code.captcha}}     <!--在views中实例化表单,并且将它传给模板-->
14         <input type="submit" value="提交">
15     </form>
16 </body>
17 </html>

 

参考文档:https://www.cnblogs.com/pythonyeyu/p/11648123.html

posted on 2020-01-29 15:09  cherry_ning  阅读(187)  评论(0)    收藏  举报

导航