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>

posted on 2020-01-29 15:09 cherry_ning 阅读(187) 评论(0) 收藏 举报
浙公网安备 33010602011771号