import random
def get_random_color():
return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) def get_valid_code_img(request):
# 方式1:
# with open("lufei.jpg","rb") as f:
# data=f.read() # 方式2: # pip install pillow # from PIL import Image
# img=Image.new("RGB",(270,40),color=get_random_color())
#
# with open("validCode.png","wb") as f:
# img.save(f,"png")
#
# with open("validCode.png","rb") as f:
# data=f.read() # 方式3: # from PIL import Image
# from io import BytesIO
#
# img=Image.new("RGB",(270,40),color=get_random_color())
# f=BytesIO()
# img.save(f,"png")
# data=f.getvalue() # 方式4: from PIL import Image, ImageDraw, ImageFont
from io import BytesIO
import random img = Image.new("RGB", (270, 40), color=get_random_color())#生成一个宽270*高40的画布,背景颜色随机 draw = ImageDraw.Draw(img)#进行绘画
kumo_font = ImageFont.truetype("../static/font/ahronbd.ttf", size=42)#字体 字体大小 valid_code_str = "" for i in range(4):
random_num = str(random.randint(0, 9))#0-9的随机数 9
random_low_alpha = chr(random.randint(97, 122))#a 到 z 随机的一个小写字母 b
random_upper_alpha = chr(random.randint(65, 90))#A 到 Z 随机的一个大写字母 Q
random_char = random.choice([random_num, random_low_alpha, random_upper_alpha]) #
draw.text((i * 50 + 20, 5), random_char, get_random_color(), font=kumo_font) #往长方形上写字 # 保存验证码字符串
valid_code_str += random_char #
#
width=270
height=40
# for i in range(10):
# x1=random.randint(0,width)
# y1=random.randint(0,height)
# x2=random.randint(0,width)
# y2=random.randint(0,height)
# draw.line((x1,y1,x2,y2),fill=get_random_color()) #画线
# #
for i in range(10):
# draw.point([random.randint(0, width), random.randint(0, height)], fill=get_random_color())#画小点
x = random.randint(0, width)
y = random.randint(0, height)
draw.arc((x, y, x + 4, y + 4), 0, 90, fill=get_random_color()) #小线段 request.session["valid_code_str"] = valid_code_str.upper() '''
1 sdajsdq33asdasd
2 COOKIE {"sessionid":sdajsdq33asdasd}
3 django-session
session-key session-data
sdajsdq33asdasd {"valid_code_str":"12345"} ''' f = BytesIO()
img.save(f, "png") #png
data = f.getvalue()
return data

views:

from django.shortcuts import render,HttpResponse,redirect
import json
from app01.models import * def login(request):
''''''
res = {'s': None, 'info': None}
if request.method == 'POST':
print(request.POST)
username = request.POST.get('LoginName')
pwd = request.POST.get('Password')
code = request.POST.get('code')
code = code.upper()
if code != request.session['valid_code_str']:
'''验证码输入错误'''
res['s'] = 0
res['info'] = '验证码输入错误'
print(res)
return HttpResponse(json.dumps(res)) manage_obj = Manage.objects.filter(name=username, pwd=pwd).first()
print(manage_obj)
if not manage_obj:
res['s'] = 0
res['info'] = '登陆失败'
print(2)
print(res)
return HttpResponse(json.dumps(res))
request.session['manage_name'] = manage_obj.name
request.session['manage_id'] = manage_obj.id
print(3)
res['s'] = 1
res['info'] = '登陆成功'
print(2)
print(res)
return HttpResponse(json.dumps(res)) return render(request,'index/login.html',locals()) def login2(request):
'''图像码'''
from app01.utils import validCode
vc = validCode.get_valid_code_img(request)
print(request.session['valid_code_str'])
return HttpResponse(vc, 'image/png') from back.views.ddff import ddff
@ddff
def out(request):
'''退出'''
a = 'User, you have successfully quit, welcome to use next time'
del request.session['manage_name']
del request.session['manage_id']
return render(request, 'index/login.html', locals())

html:

<form action="" method="post">
{% csrf_token %}
<ul>
<li><input name="LoginName" type="text" class="loginuser" placeholder="admin"/></li>
<li><input name="Password" type="text" class="loginpwd" placeholder="密码"/></li>
<li class="yzm" style="width:230px;height:60px ;">
<span><input name="code" type="text" placeholder="验证码"/><img width="115" height="46" id="valid_code_img" src="/back/login/login2/" alt="" onclick="this.src='/back/login/login2/?'+Math.random()" style="position: absolute;"></span> </li> <li>
<input id="submitBtn" type="button" class="loginbtn" value="登录"/>
<label><input name="" type="checkbox" value="" checked="checked" />记住密码</label>
{# <label><a href="#">忘记密码?</a></label>#}
</li>
</ul>
</form> <script>
$(document).ready(function () {
$("#submitBtn").click( function () {
// 点击事件
$.post("/back/login/login/",$('form').serialize() , function (data) {
//LoginName,Password,code
if (data['s'] == 1) {
layer.msg("登录成功!");
// 跳转主页面
location.href="{% url 'back:index/index/' %}";
} else {
//登陆失败
layer.msg(data['info']);
}
return false;
}, "json"); })
})
</script>

python-Web-django-图形验证的更多相关文章

  1. python web -- django

    一. 安装 django $ pip install django (env)$ python >> import django >> django.VERSION >& ...

  2. python web——Django架构

    环境:windows/linux/OS 需要的软件:Firefox 浏览器(别的也可以 不过firfox和python的webdriver兼容性好) git版本控制系统(使用前要配置 用户 编辑器可以 ...

  3. python web django base skill

    web框架本质 socket + 业务逻辑 框架实现socket tonado node.js 使用WSGI实现socket django flask 自己实现框架思路 wsgiref socket ...

  4. python web django 2nd level -- 待更新

    练习代码位置 实例代码位置 --> app: myblog Form 利用Form表单验证,自己写的html 思路: 新建一个类 LoginForm(forms.Form) 新建对象 obj = ...

  5. [Python] 利用Django进行Web开发系列(一)

    1 写在前面 在没有接触互联网这个行业的时候,我就一直很好奇网站是怎么构建的.现在虽然从事互联网相关的工作,但是也一直没有接触过Web开发之类的东西,但是兴趣终归还是要有的,而且是需要自己动手去实践的 ...

  6. python web框架——扩展Django&tornado

    一 Django自定义分页 目的:自定义分页功能,并把它写成模块(注意其中涉及到的python基础知识) models.py文件 # Create your models here. class Us ...

  7. python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...

  8. 选择一个 Python Web 框架:Django vs Flask vs Pyramid

    Pyramid, Django, 和 Flask都是优秀的框架,为项目选择其中的哪一个都是伤脑筋的事.我们将会用三种框架实现相同功能的应用来更容易的对比三者.也可以直接跳到框架实战(Framework ...

  9. python web框架Django入门

    Django 简介 背景及介绍 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以 ...

  10. Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...

随机推荐

  1. 二维数组转化为json数组

    二维数组转化为json数组 -1 var colName = [ ["08020092", "AVX", "1200m", "12 ...

  2. html 与 jsp 文件格式区别

    html 与 jsp 文件格式区别 html5 <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...

  3. 题解 比赛 match

    比赛 match Description 有 N 支队伍打比赛.已知有如下条件: • 每支队伍恰好打了 4 场比赛 • 对于一场比赛,如果是平局,双方各得 1 分:否则胜者得 3 分,负者不得分 给定 ...

  4. Unicode规范中的BOM 和 ISO8891-1编码

    Unicode规范中的BOM Unicode规范中有一个BOM的概念.BOM——Byte Order Mark,就是字节序标记.在这里找到一段关于BOM的说明: 在UCS 编码中有一个叫做" ...

  5. yii 创建模块module

    yii安装完成后的使用: yii也是单入口脚本, 入口文件为  http://hostname/web/index.php 使用模块: 在根目录下创建modules目录 在modules目录下创建模块 ...

  6. MD5 加密 字符串

    //获取字符串的MD5码 public string CreateMD5Hash(string input) { // Use input string to calculate MD5 hash S ...

  7. TTTTTTTTTTTTTTTT hdu 5510 Bazinga 字符串+哈希

    Bazinga Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  8. MySQL_(Java)使用JDBC向数据库中插入(insert)数据

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC向数据库中插入(insert)数据 传送门 MySQL_(Java)使用JDBC向数据库中删除(d ...

  9. 使用yum安装nginx

    在CentOS 7中安装Nginx. 当使用以下命令安装Nginx时,发现无法安装成功. 1 yum install -y nginx 需要做一点处理. 安装Nginx源 执行以下命令: 1 rpm ...

  10. 简单的多屏播放器示例(vlc+qt)

      介绍 简单的多屏播放器 最多同时播放16个视频 支持本地文件和rtsp.rtmp等流媒体播放 VS2015工程,依赖Qt+VLC 练手作品 截图 下载 程序:download.csdn.net/d ...