用户登录ajax局部刷新验证码
用户登录的时候,登录页面附带验证码图片,用户需要输入正确的验证码才可以登录,验证码实现局部刷新操作。
效果如图:

代码如下:
#生成验证码及图片的函数 newcode.py
import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter _letter_cases = "abcdefghjkmnpqrstuvwxy" # 小写字母,去除可能干扰的i,l,o,z
_upper_cases = _letter_cases.upper() # 大写字母
_numbers = ''.join(map(str, range(3, 10))) # 数字
init_chars = ''.join((_letter_cases, _upper_cases, _numbers)) def create_validate_code(size=(110, 40),
chars=init_chars,
img_type="GIF",
mode="RGB",
bg_color=(255, 255, 255),
fg_color=(0, 0, 255),
font_size=18,
font_type="Monaco.ttf",
length=4,
draw_lines=True,
n_line=(1, 2),
draw_points=True,
point_chance=2): width, height = size # 宽高
# 创建图形
img = Image.new(mode, size, bg_color)
draw = ImageDraw.Draw(img) # 创建画笔 def get_chars():
"""生成给定长度的字符串,返回列表格式"""
return random.sample(chars, length) def create_lines():
"""绘制干扰线"""
line_num = random.randint(*n_line) # 干扰线条数 for i in range(line_num):
# 起始点
begin = (random.randint(0, size[0]), random.randint(0, size[1]))
# 结束点
end = (random.randint(0, size[0]), random.randint(0, size[1]))
draw.line([begin, end], fill=(0, 0, 0)) def create_points():
"""绘制干扰点"""
chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100] for w in range(width):
for h in range(height):
tmp = random.randint(0, 100)
if tmp > 100 - chance:
draw.point((w, h), fill=(0, 0, 0)) def create_strs():
"""绘制验证码字符"""
c_chars = get_chars()
strs = ' %s ' % ' '.join(c_chars) # 每个字符前后以空格隔开 #定义font字体
font = ImageFont.truetype(font_type, font_size)
font_width, font_height = font.getsize(strs) draw.text(((width - font_width) / 3, (height - font_height) / 3),
strs, font=font, fill=fg_color) return ''.join(c_chars) if draw_lines:
create_lines()
if draw_points:
create_points()
strs = create_strs() # 图形扭曲参数
params = [1 - float(random.randint(1, 2)) / 100,
0,
0,
0,
1 - float(random.randint(1, 10)) / 100,
float(random.randint(1, 2)) / 500,
0.001,
float(random.randint(1, 2)) / 500
]
img = img.transform(size, Image.PERSPECTIVE, params) # 创建扭曲 img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) # 滤镜,边界加强(阈值更大) return img, strs
# 后台构造前端ajax请求的url url.py
url(r'^createCodeImg/$', create_code_img,name='createCodeImg'),
#生成验证码图片views.py
from newcode.py import create_validate_code
@csrf_exempt
def create_code_img(request): f = BytesIO() # 直接在内存开辟一点空间存放临时生成的图片
# 调用check_code生成照片和验证码
img, code = create_validate_code()
# 将验证码存在服务器的session中,用于校验
request.session['check_code'] = code
img.save(f, 'PNG')
# 将内存的数据读取出来,并以HttpResponse返回
return HttpResponse(f.getvalue())
#前端页面 验证码图片src地址
<img id="codepic" src={% url 'common:createCodeImg' %} onclick="refreshcode(this);"/>点击刷新
#也可以写成<img id="codepic" src='/common:createCodeImg/' onclick="refreshcode(this);"/>点击刷新
#javascript+ajax刷新验证码
function refreshcode(ths)
{
// alert('点击了图片');
var url = "/createCodeImg/";
$.ajax({
url: url,
type: "POST",
data: {},
dataType: 'text',
success: function(data, statusText, xmlHttpRequest){
console.log(data);
// $("#codepic").attr("src",data+"?flag="+Math.random());
ths.src += '?';
//此处刷新图片src
},
error: function(xmlHttpRequest, statusText, errorThrown){
//
}
});
};
#登录视图函数
def log_in(request):
try:
if request.method == 'POST':
login_form = LoginForm(request.POST)
if login_form.is_valid():
# 取会话中验证码
session_check_code = request.session['check_code']
post_check_code = login_form.cleaned_data['check_code']
username = login_form.cleaned_data["username"]
password = login_form.cleaned_data["password"]
# django自带验证
# user = authenticate(username=username, password=password)
# 数据库查询验证
user = UserProfile.objects.get(username=username, password=password)
print user
if user is not None:
if user.is_active:
if session_check_code == post_check_code:
user.backend = 'django.contrib.auth.backends.ModelBackend' login(request, user)
msg=(u"login successful !登录成功!")
# return render(request, 'common/success.html', {'reason': msg})
else:
msg = (u"check code is wrong!验证码错误!请返回重新输入")
return render(request, 'common/failure.html', {'reason': msg})
else:
msg=(u"disabled account please active your account!账户未激活!")
return render(request, 'common/failure.html', {'reason': msg})
else:
msg=(u"invalid account please register!无效的账户!请重新注册!")
return render(request, u'common/failure.html', {'reason': msg})
else:
login_form = LoginForm()
except Exception as e:
print '错误',e
# logger.error(e) return render(request, 'common/first.html', locals())
做到这里,图片就可以实现局部刷新了!登录的时候将页面获取到的验证码和保存在session里面的比较,用户输入正确才能登录成功。
这里生产验证码图片的方法涉及图形库相关知识,大概了解就行了!
参考:http://www.jb51.net/article/111525.htm
用户登录ajax局部刷新验证码的更多相关文章
- ajax局部刷新
//5秒刷新一次 $(function () { setInterval(Refresh, 5000); }); //ajax局部刷新 function Refresh() { $.ajax({ ty ...
- php Ajax 局部刷新
php Ajax 局部刷新: HTML部分 </head> <body> <h1>Ajax动态显示时间</h1> <input type=&quo ...
- Spring MVC 学习笔记9 —— 实现简单的用户管理(4)用户登录显示局部异常信息
Spring MVC 学习笔记9 -- 实现简单的用户管理(4.2)用户登录--显示局部异常信息 第二部分:显示局部异常信息,而不是500错误页 1. 写一个方法,把UserException传进来. ...
- Ajax 局部刷新 异步提交
AJAX简介 局部刷新,异步提交. AJAX 不是新的编程语言,而是一种使用现有标准的新方法.它最大的有点就是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容. 浏览器朝后端发送请 ...
- thickbox关闭子页后ajax局部刷新父页
1. 首先注意需要调用thickbox的js <script type="text/javascript" src="<%=path%>/js/jque ...
- 实现AJAX局部刷新以及PageMethod方法的使用
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...
- Ajax局部刷新(使用JS操作)
对于在不使用Ajax的情况下,使用JS来进行局部刷新,主要有如下的几步: 1. 得到XMLHttpRequest 2. 使用open方法打开连接 3. 设置请求头信息 4. 注册onreadystat ...
- Ecshop ajax 局部刷新购物车功能
1.比如我们category.dwt 里有 <a href='flow.php'><SPAN id='cart_count_all'>{insert name='cart_in ...
- ajax局部刷新后,如何让局部中的百度分享重新加载
我这个人不怎么喜欢说太多话,看几个图你们就懂了 Ajax前 Ajax之后 原因分析 解决方法 收工 百度分享是集成了众多主流第三方网站分享和收藏按钮的工具. 通过百度分享轻松将主流第三方网站的分享按钮 ...
随机推荐
- Android--推断文本文件编码
方法1:利用windows文本文件编码特点. windows下.Unicode.Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节,各自是FF.FE(Unicode) ...
- jquery XHTML
传送门:异步编程系列目录…… 示例源码:触碰jQuery:AJAX异步详解.rar AJAX 全称 Asynchronous JavaScript and XML(异步的 JavaScript 和 X ...
- 【转】CStdioFile UNICODE编译 英文系统下读取中文汉字乱码解决
转载出处:http://www.cnblogs.com/ct0421/p/3242418.html 函数原形为:char *setlocale( int category, const char *l ...
- 【BZOJ5070】危险的迷宫 最小费用最大流
[BZOJ5070]危险的迷宫 Description JudgeOnline/upload/201710/55.doc Input 第一行是两个整数A与B(1≤A,B≤10),中间用空格分隔,表示该 ...
- MySQL安装和Navicat安装、破解
1)mysql下载 地址:https://dev.mysql.com/downloads/mysql/ 2)一路next安装,安装好后文件目录如下(不包括data文件夹,my.ini文件) 3)新建文 ...
- delphi 一些知识文章地址记录(正则)
正则运用:http://www.cnblogs.com/del/archive/2007/12/21/1008108.html
- VS2010 / MFC + OpenCV 2.4.1打开图片
Windows 7 x64,VS2010 / MFC + OpenCV 2.4.1打开图片显示到Picture控件中. OpenCV 2.2.OpenCV 2.3同样适用. 工具/原料 WinXP / ...
- 推流协议 支持RTMP协议推流
Stream Type Stream play domain nameStreaming Domain Name 播流 推流 推流协议 支持RTMP协议推流
- js滚动显示: 滚动条置顶/底
<script> //当聊天室的内容超出页面范围时, 如何让页面刷新后 显示最下面的内容 document.getElementByIdx ( 'chatboard').scrollTop ...
- IO流入门-第十三章-File相关
/* java.io.File 1.File和流无关,不能通过该类完成文件的读写 2.File是文件和目录路径名的抽象变现形式. */ import java.io.*; public class F ...