Django框架之验证码生成示例
一、生成随机颜色的图片
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框架之验证码生成示例的更多相关文章
- django框架介绍
主要内容 1. Django框架发展 2. Django架构,MTV模式 3. 开发流程 4. 开发实例——Poll python下各种框架 一 ...
- django框架配置mysql数据库
django配置mysql数据库: 1.首先更改django项目文件中的settings.py的数据库配置 DATABASES = { 'default': { 'ENGINE': 'django.d ...
- 开发工具类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等
以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...
- web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例
Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...
- Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)
一.Django中的缓存: 前戏: 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一 ...
- 第三百二十节,Django框架,生成二维码
第三百二十节,Django框架,生成二维码 用Python来生成二维码,需要qrcode模块,qrcode模块依赖Image 模块,所以首先安装这两个模块 生成二维码保存图片在本地 import qr ...
- 框架----Django框架知识点整理
一.cbv cbv(class-base-view) 基于类的视图 fbv(func-base-view) 基于函数的视图 a.基本演示 urlpatterns = [ url(r'^login.ht ...
- Django框架全面讲解
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- Django框架详细介绍---模型---ORM
一.概述 ORM(Object Relational Mapping),全称:对象关系映射,简单的说就是通过创建类.实例化出对象的方法,使得类.对象.对象的属性能够和数据库中的表.记录.字段意义对应. ...
随机推荐
- java学习笔记整理
java知识模块:1.基础知识,数组,字符串,正则表达式:2.类和对象,接口,继承,多态,抽象类,内部类,泛型,java常用类库.3.异常处理: 4.IO: 5.事件处理: 6.多线程: 7 ...
- CentOS rpm
rpm命令是RPM软件包的管理工具.rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎.逐渐受到其他发行版的采用.RPM ...
- HDFS之深入简出(一)
分布式文件系统HDFS 一:概述 1.HDFS设计目标 2.HDFS核心组件 3.HDFS副本机制 4.HDFS环境搭建 5.HDFS shell命令 java api 6.HDFS读写流程 7.H ...
- Python+Selenium学习--鼠标事件
场景 前景讲解了鼠标的click()事件,而我们在实际的web产品测试中,有关鼠标的操作,不仅仅只有单击,有时候还包括右击,双击,拖动等操作,这些操作包含在ActionChains类中. Action ...
- PHP中的变量与PHP中算false的情况
一PHP中的变量 1.PHP中的变量,声明与使用必须用$开头 2.PHP是一种弱类型语言,变量其实并不需要声明.可以直接给变量赋任何类型的值: 3.PHP中可以使用连等同时声明多个变量, eg:num ...
- manipulate
manipulate - 必应词典 美[mə'nɪpjə.leɪt]英[mə'nɪpjʊleɪt] v.控制:摆布:(有技巧地)使用:巧妙地处理(问题等) 网络操纵:被操纵:被控体 变形第三人称单数: ...
- Chrome格式化JavaScript代码
很多第三方插件的脚本,是压缩后的代码,甚至时动态加载的,代码只有一行. Chrome提供了格式化脚本代码的功能,方便加断点调试. 1 在Sources面板中,点击脚本名称,打开脚本源码. 2 点击左下 ...
- 单例&多线程
单例模式,最常见的就是饥饿模式,和懒汉模式,一个直接实例化对象,一个在调用方法时进行实例化对象.在多线程模式中,考虑到性能和线程安全问题,我们一般选择下面两种比较经典的单例模式,在性能提高的同时,又保 ...
- unbutu中安装jdk并编写第一个java程序
第一部分:安装jdk 1.首先在putty控制台中输入如下命令,检验系统中是否已经装有jdk. java -version 如果显式的结果如下图,则说明没有安装. openjdk是在linux下默认安 ...
- code first 添加外键时,与原有的数据冲突ALTER TABLE 语句与 FOREIGN KEY 约束"FK_XXXXX"冲突
问题的原因是新增的外键字段没有默认值,造成的,有很多方法可以解决,我这里通过修改生成的迁移文件,设定为可空,或者设置默认值即可.具体看情况使用.