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. 为什么程序员一定要会用Google和Stack Overflow?

    为什么程序员一定要会用Google和Stack Overflow? https://blog.csdn.net/u012207345/article/details/81139665 StackOve ...

  2. 学习如何写一个vue插件【入门篇】

    #### 疑答 1.市面上已经有那么多插件可用,为什么还要造轮子?学习.借鉴思想.应用到开发 2.能否在项目中使用?与网上插件使用相同   更新维护问题怎么解决? 自身动力,使用者反馈等 #### 准 ...

  3. 关于RedisTemplate和StringRedisTemplate(转)

    最近在开始在学习Redis以及如何在Java当中去使用Redis,Redis是什么我这里就不说了. 我主要想说的是Redis和Java当中Spring结合起来的时候,使用到的RedisTemplate ...

  4. springboot2.x下actuator模块

    一.简介    spring-boot-starter-actuator模块是一个spring提供的监控模块.我们在开运行发过程中,需要实时和定时监控服务的各项状态和可用性.Spring Boot的s ...

  5. 什么是URL百分号编码?

    ㈠什么是URL 统一资源定位系统(uniform resource locator;URL)是因特网的万维网服务程序上用于指定信息位置的表示方法. ㈡URL编码 url编码是一种浏览器用来打包表单输入 ...

  6. 【Python网络】HTTP

    HTTP概述 HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器和万维网服务器之间互相通信的规则. HTTP就是一个通信规则,通信规则规定 ...

  7. Gym 100971D 单调栈

    D - Laying Cables Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u ...

  8. Linux下SHA256校验

    一.将Hash: SHA256文件和需要检验的文件放在同一个文件夹内 二.$sha256sum -c SHA265 文件 输出: 校验文件:ok

  9. 树状数组(BIT)

    树状数组 树状数组是在线段树的结构上改造而来数据结构,主要用于完成: 给定一个初始值全为0的数列 ①给定i,计算返回a1+a2+--+ai的值 ②给定i和x,执行ai+=x BIT的求和 ll sum ...

  10. node链接mongoDB及封装

    // 这个模块中封装所有对数据库的常用操作 const MongoClient = require('mongodb').MongoClient; const assert = require('as ...