一、生成随机颜色的图片

1)前端代码展示

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.min.css">
<script src="/static/jquery-3.1.1.js"></script>
<title>登录页面</title>
</head>
<body> <div class="container-fluid">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h1>登录</h1>
<form>
<div class="form-group">
<label for="">用户名</label>
<input type="text" id="id_name" class="form-control">
</div> <div class="form-group">
<label for="">密码</label>
<input type="password" id="id_pwd" class="form-control">
</div> <div class="form-group">
<label for="">验证码</label>
<div class="row">
<div class="col-lg-6">
<input type="text" id="code" class="form-control">
</div>
<div class="col-lg-6">
<img height="" width="" src="/get_code/" alt="">
</div>
</div>
</div>
<input type="button" value="登录" class="btn btn-danger">
</form> </div>
</div>
</div> </body>
</html>

login.html

提交方式,基于ajax提交

2)生成随机颜色的图片

def get_random_color():
'''生成随机颜色的图片'''
import random
return (random.randint(,),random.randint(,),random.randint(,))

get_random_color

3)验证码函数,写入图片,读取图片返回给前端

def get_code(request):
from PIL import Image
img = Image.new('RGB',(,),color=get_random_color())
with open('code.png','wb') as f: # 造成随机颜色的图片
img.save(f) with open('code.png','rb') as f: # 读取图片,给前端
data=f.read() return HttpResponse(data)

get_code

二、在随机验证码图片内写入文字.(重点)

随机生成的验证码图片,保存于内存。图片内的文字保存于session(用于登录验证)

def get_code(request):
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO # 生成的验证码存放于内存
import random
img = Image.new("RGB", (, ), color=get_random_color())
# (, ) 指定生成的图片的长度,高度
draw = ImageDraw.Draw(img)
# kumo.ttf 文字样式,网上下载ttf
kumo_font = ImageFont.truetype("static/font/kumo.ttf", size=) # 引入字体 valid_code_str = ""
for i in range():
random_num = str(random.randint(, )) # 随机一个数字
random_low_alpha = chr(random.randint(, )) # 随机一个小写字母
random_upper_alpha = chr(random.randint(, )) # 随机一个大写字母
random_char = random.choice([random_num, random_low_alpha, random_upper_alpha]) # 从上面的3个选择一个出来
draw.text((i * + , ), random_char, get_random_color(), font=kumo_font) # (i * + , ) 写字母的时候便宜 # 保存验证码字符串
valid_code_str += random_char print("valid_code_str", valid_code_str)
f = BytesIO() # 生成一个对象,保存于内存
img.save(f, "png") # 验证码图片保存于内存
data = f.getvalue()
request.session['code']=valid_code_str # 验证码保存于session中 return HttpResponse(data)

get_code

三、加入ajax请求登录

1)url视图函数

from django.conf.urls import url
from django.contrib import admin
from mybbs import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^get_code/', views.get_code),
]

url.py

2)login页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.min.css">
<script src="/static/jquery-3.1.1.js"></script>
<title>登录页面</title>
</head>
<body> <div class="container-fluid">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h1>登录</h1>
<form>
{% csrf_token %}
<div class="form-group">
<label for="">用户名</label>
<input type="text" id="id_name" class="form-control">
</div> <div class="form-group">
<label for="">密码</label>
<input type="password" id="id_pwd" class="form-control">
</div> <div class="form-group">
<label for="">验证码</label>
<div class="row">
<div class="col-lg-6">
<input type="text" id="code" class="form-control">
</div>
<div class="col-lg-6">
<img height="35" width="250" src="/get_code/" alt="">
</div>
</div>
</div>
<input type="button" id="submit" value="登录" class="btn btn-danger">
</form> </div>
</div>
</div> <script>
$("#submit").click(function () {
$.ajax({
url: '/login/',
type: 'post',
data: {
'name': $("#id_name").val(),
'pwd': $("#id_pwd").val(),
'code': $("#code").val(),
'csrfmiddlewaretoken': '{{csrf_token}}'
},
success: function (data) {
console.log(data)
}
})
})
</script>
</body>
</html>

login.html

3)验证码相关函数

def get_random_color():
'''生成随机颜色的图片'''
import random
return (random.randint(,),random.randint(,),random.randint(,)) def get_code(request):
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO # 生成的验证码存放于内存
import random
img = Image.new("RGB", (, ), color=get_random_color())
# (, ) 指定生成的图片的长度,高度
draw = ImageDraw.Draw(img)
# kumo.ttf 文字样式,网上下载ttf
kumo_font = ImageFont.truetype("static/font/kumo.ttf", size=) # 引入字体 valid_code_str = ""
for i in range():
random_num = str(random.randint(, )) # 随机一个数字
random_low_alpha = chr(random.randint(, )) # 随机一个小写字母
random_upper_alpha = chr(random.randint(, )) # 随机一个大写字母
random_char = random.choice([random_num, random_low_alpha, random_upper_alpha]) # 从上面的3个选择一个出来
draw.text((i * + , ), random_char, get_random_color(), font=kumo_font) # (i * + , ) 写字母的时候便宜 # 保存验证码字符串
valid_code_str += random_char print("valid_code_str", valid_code_str)
f = BytesIO() # 生成一个对象,保存于内存
img.save(f, "png") # 验证码图片保存于内存
data = f.getvalue()
request.session['code']=valid_code_str # 验证码保存于session中 return HttpResponse(data)

验证码相关请求函数

4)login函数请求(判断ajax)

from django.contrib import auth
def login(request):
if request.is_ajax():
name=request.POST.get('name')
pwd=request.POST.get('pwd')
code=request.POST.get('code') if code.upper()== request.session['code'].upper():
user=auth.authenticate(request,username=name,password=pwd)
if user:
return HttpResponse('ok')
else:
return HttpResponse('用户名或密码错误')
else:
return HttpResponse('验证码错误') return render(request,'login.html')

Views.login

Django框架之验证码生成示例的更多相关文章

  1. django框架介绍

    主要内容 1.        Django框架发展 2.        Django架构,MTV模式 3.        开发流程 4.        开发实例——Poll python下各种框架 一 ...

  2. django框架配置mysql数据库

    django配置mysql数据库: 1.首先更改django项目文件中的settings.py的数据库配置 DATABASES = { 'default': { 'ENGINE': 'django.d ...

  3. 开发工具类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...

  4. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  5. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)

    一.Django中的缓存: 前戏: 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一 ...

  6. 第三百二十节,Django框架,生成二维码

    第三百二十节,Django框架,生成二维码 用Python来生成二维码,需要qrcode模块,qrcode模块依赖Image 模块,所以首先安装这两个模块 生成二维码保存图片在本地 import qr ...

  7. 框架----Django框架知识点整理

    一.cbv cbv(class-base-view) 基于类的视图 fbv(func-base-view) 基于函数的视图 a.基本演示 urlpatterns = [ url(r'^login.ht ...

  8. Django框架全面讲解

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  9. Django框架详细介绍---模型---ORM

    一.概述 ORM(Object Relational Mapping),全称:对象关系映射,简单的说就是通过创建类.实例化出对象的方法,使得类.对象.对象的属性能够和数据库中的表.记录.字段意义对应. ...

随机推荐

  1. java学习笔记整理

    java知识模块:1.基础知识,数组,字符串,正则表达式:2.类和对象,接口,继承,多态,抽象类,内部类,泛型,java常用类库.3.异常处理: 4.IO:   5.事件处理:   6.多线程:  7 ...

  2. CentOS rpm

    rpm命令是RPM软件包的管理工具.rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎.逐渐受到其他发行版的采用.RPM ...

  3. HDFS之深入简出(一)

    分布式文件系统HDFS 一:概述 1.HDFS设计目标 2.HDFS核心组件 3.HDFS副本机制 4.HDFS环境搭建 5.HDFS shell命令  java api 6.HDFS读写流程 7.H ...

  4. Python+Selenium学习--鼠标事件

    场景 前景讲解了鼠标的click()事件,而我们在实际的web产品测试中,有关鼠标的操作,不仅仅只有单击,有时候还包括右击,双击,拖动等操作,这些操作包含在ActionChains类中. Action ...

  5. PHP中的变量与PHP中算false的情况

    一PHP中的变量 1.PHP中的变量,声明与使用必须用$开头 2.PHP是一种弱类型语言,变量其实并不需要声明.可以直接给变量赋任何类型的值: 3.PHP中可以使用连等同时声明多个变量, eg:num ...

  6. manipulate

    manipulate - 必应词典 美[mə'nɪpjə.leɪt]英[mə'nɪpjʊleɪt] v.控制:摆布:(有技巧地)使用:巧妙地处理(问题等) 网络操纵:被操纵:被控体 变形第三人称单数: ...

  7. Chrome格式化JavaScript代码

    很多第三方插件的脚本,是压缩后的代码,甚至时动态加载的,代码只有一行. Chrome提供了格式化脚本代码的功能,方便加断点调试. 1 在Sources面板中,点击脚本名称,打开脚本源码. 2 点击左下 ...

  8. 单例&多线程

    单例模式,最常见的就是饥饿模式,和懒汉模式,一个直接实例化对象,一个在调用方法时进行实例化对象.在多线程模式中,考虑到性能和线程安全问题,我们一般选择下面两种比较经典的单例模式,在性能提高的同时,又保 ...

  9. unbutu中安装jdk并编写第一个java程序

    第一部分:安装jdk 1.首先在putty控制台中输入如下命令,检验系统中是否已经装有jdk. java -version 如果显式的结果如下图,则说明没有安装. openjdk是在linux下默认安 ...

  10. code first 添加外键时,与原有的数据冲突ALTER TABLE 语句与 FOREIGN KEY 约束"FK_XXXXX"冲突

    问题的原因是新增的外键字段没有默认值,造成的,有很多方法可以解决,我这里通过修改生成的迁移文件,设定为可空,或者设置默认值即可.具体看情况使用.