【插拔式】自定义图片验证码开源

1:第一种自定义验证码(推荐)

  1 前端:   <img id ="img"  src=/路由/"> <span {{ dict.error }}</span>
  2 前端js刷新验证码:
  3 <script>
  4     img =document.getElementById(");
  5     img.onclick = function () {
  6         img.src = img.src + ?";    #利用加?来刷新图片生成更换
  7     }
  8 </script>
  9 
 10 
 11 
 12 校验验证码函数:
 13 if request.method == POST:
 14         dict = {}           用户返回错误信息
 15          判断验证码
 16         input_code = request.POST.get(code").upper() 输入的验证码
 17         obj = F1(request.POST)  输入框的所有数据
 18 
 19         if obj.is_valid() and input_code == request.session["]:   #判断输入的值是否等于注册session的验证码(生成随机码的时候已经注册到session)
 20 
 21              插入数据库,这里是删除不需要添加到数据表的key
 22             obj.cleaned_data.pop(again_password)
 23             obj.cleaned_data.pop( 24             models.UserInfo.objects.create_user(**obj.cleaned_data)
 25             return redirect(/index/login/")  返回页面
 26         else 27             dict[error"] = 验证码不匹配"
 28             return render(request,register.html",{obj":obj,1)">dict:dict})
 29 
 30 
 31 
 32 
 33 验证码生成(直接复制到对应视图最下面):
 34 后端视图对应的路由 :
 35 
 36 验证码:
 37 from PIL import Image,ImageDraw,ImageFont,ImageFilter
 38  random
 39 
 40 
 41 随机颜色
 42 def random_color():
 43     return random.randint(0,255),random.randint(0,255 44 
 45 def code(request,width=150,height=35):
 46      with open("1.png","wb") as f:
 47      定义一个图片,并且设置参数
 48     img_obj = Image.new('RGB',size=(width,height),color=(255,255))   长宽   颜色
 49 
 50      创建画笔在画布上
 51     draw_obj = ImageDraw.Draw(img_obj)
 52      自定义字体
 53     font_obj = ImageFont.truetype(Monaco.ttf 54 
 55      写干扰点
 56     for i in range(40 57         draw_obj.point([random.randint(0,width),height)],fill=random_color())
 58 
 59      写干扰圆圈
 60      61         draw_obj.point([random.randint(0,1)"> 62         x = random.randint(0,width)
 63         y = 64         draw_obj.arc((x,y,x + 4,y + 4),90,1)"> 65 
 66          画干扰线
 67     in range(5 68         x1 = 69         y1 = 70         x2 = 71         y2 = 72 
 73         draw_obj.line((x1,y1,x2,y2),1)"> 74 
 75         img = img_obj.filter(ImageFilter.EDGE_ENHANCE_MORE)
 76 
 77      随机字符串
 78      79         l = chr(random.randint(97,122))   小写字母
 80         b = chr(random.randint(65,90))   大学字母
 81         n = str(random.randint(0,9))
 82 
 83         t = random.choice([b,l,n])
 84 
 85          在text参数设置坐标,字符串,颜色,字体
 86         draw_obj.text((i * 30,0),t,fill=random_color(),font=font_obj)
 87         
 88     放到session,并且忽略大小写
 89     request.session["".join(temp).upper()
 90 
 91     写入内存,显示到网页上
 92     f = open(1.pngrb 93     data =f.read()
 94     from io  BytesIO
 95     f1 = BytesIO()
 96     img_obj.save(f1,format=PNG 97     image_data = f1.getvalue()
 98 
 99 
100     return HttpResponse(image_data,content_type=image/png")

2:第二种验证码(据说有BUG)博主没用过

1) 安装 django-simple-captcha:
pip install django-simple-captcha


2)注册captcha
INSTALLED_APPS = [
    django.contrib.admin',django.contrib.authdjango.contrib.contenttypesdjango.contrib.sessionsdjango.contrib.messagesdjango.contrib.staticfilescaptcha 设置 captcha 图片大小
CAPTCHA_IMAGE_SIZE = (80,45 字符个数
CAPTCHA_LENGTH = 4
 超时(minutes)
CAPTCHA_TIMEOUT = 1



3)创建它的表
python manage.py makemigrations
python manage.py migrate


4)添加路由
urlpatterns = [
    url(admin/ 图片验证码 路由
    url(captcha/captcha.urls))

]
再添加ajax刷新请求的二级路由,ajxa请求地址: captcha/refresh_captcha/
url(refresh_captcha/ 刷新验证码,ajax



5)在form文件中直接导入模块:
from captcha.fields  CaptchaField

6)在写的form类下填写生成标签:
Captcha = CaptchaField()

7)前端设置跟其他组件一致,存放数据库:
obj.cleaned_data.pop(" ")
ps:django-simple-captcha有一些多余的功能,所以从它的源代码中提取了一部分加以修改,生成了一个简单的验证码模块。在使用django-simple-captcha时发现了一个Bug,
该库使用HttpResponse.write(image_data)的方式返回验证码图片数据,导致验证码图片无法显示,具体原因还不清楚,
不过换成HttpResponse(content=image_data)的方式就好了。这也是我自定义验证码功能的原因。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


注:所有源代码均实测运行过。所有源代码均已上传CSDN,请有需要的朋友自行下载。
继承APIView和ViewSetMixin;作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。ViewSet在开发接口中不经常用。
一、Django介绍Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django 是一个开放源代码的 Web 应用框架,由 Python 写成。Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。Django学习线路Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。这个MVT模式并
本文从nginx快速掌握到使用,gunicorn快速掌握到使用,实现小白快速搭建django项目,并对可能出现的报错进行了分析
uniapp微信小程序订阅消息发送服务通知
Django终端打印SQL语句 1 Setting配置: 2 默认python 使用的MysqlDB连接,Python3 支持支持pymysql 所有需要在app里面的__init__加上下面配置:
url: re_path(&#39;authors/$&#39;, views.AuthorView.as_view()), re_path(&#39;book/(?P\d+)/$&#39;, vie
前提 关于html寻找路线: template 如果在各个APP中存在, Django 会优先找全局template 文件下的html文件,如果全局下的template文件没有相关的html Djan
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
from bs4 import BeautifulSoup#kindeditordef kindeditor(request): s = &#39;&#39;&#39; &lt;li&gt;&lt;s
view.py 配置 html 配置
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault(&#39;content_type&#
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
return HttpResponse(&quot;OK&quot;) 返回一个字符串 return redirect(&quot;/index/&quot;) 返回URL return render
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault(&#39;content_type&#
浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况
自动发送 &gt; 依赖jQuery文件 实例--&gt;GET请求: 手动发送 &gt; 依赖浏览器XML对象(也叫原生ajax) Ajax主要就是使用 【XmlHttpRequest】对象来完成请
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
return HttpResponse(&quot;OK&quot;) 返回一个字符串 return redirect(&quot;/index/&quot;) 返回URL return render