第二百七十节,Tornado框架-生成验证码图片,以及验证码结合Session验证

Tornado框架-生成验证码图片,以及验证码结合Session验证

第一、生成验证码图片

 生成验证码图片需要两个必须模块

  1、python自带的random(随机模块)

  2、Pillow()图像处理模块里的PIL(图像库),为第三方模块,需要安装

封装验证码图片生成插件py

在封装文件里先导入random(随机模块),和Pillow()图像处理模块里的所需py文件

封装验证码图片生成插件功能,调用后返回验证码图片,和字符串类型验证码,两个返回值

注意:验证码需要一个字体文件,这个字体文件必须和封装创建放在一起

验证码图片生成插件py

#!/usr/bin/env python
#coding:utf-8

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=(120, 30),
                         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):
    ‘‘‘
    @todo: 生成验证码图片
    @param size: 图片的大小,格式(宽,高),默认为(120, 30)
    @param chars: 允许的字符集合,格式字符串
    @param img_type: 图片保存的格式,默认为GIF,可选的为GIF,JPEG,TIFF,PNG
    @param mode: 图片模式,默认为RGB
    @param bg_color: 背景颜色,默认为白色
    @param fg_color: 前景色,验证码字符颜色,默认为蓝色#0000FF
    @param font_size: 验证码字体大小
    @param font_type: 验证码字体,默认为 ae_AlArabiya.ttf
    @param length: 验证码字符个数
    @param draw_lines: 是否划干扰线
    @param n_lines: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为True时有效
    @param draw_points: 是否画干扰点
    @param point_chance: 干扰点出现的概率,大小范围[0, 100]
    @return: [0]: PIL Image实例
    @return: [1]: 验证码图片中的字符串
    ‘‘‘

    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 = 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  #返回验证码图片,和字符串类型验证码

验证码图片生成插件py使用方法

在验证码HTML的,img标签的src图片地址,路由映射的逻辑处理函数里使用

首先在要显示验证码图片的html,img标签的src="/yanzhma",一个路由映射路径

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>请登录</h1>
    <form method="post" action="/dlu">
        用户名<input type="text" name="yhm"/><br/><br/>
        密码<input type="text" name="mim"/><br/><br/>
        验证码<input type="text" name="yanzhma"/><br/><br/>
        <img src="/yanzhma"><br/><br/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>

在框架引擎,配置这个验证码图片src路由映射路径,和逻辑处理函数

src路由映射路径的逻辑处理函数里使用验证码图片生成插件

需要导入io模块,和,生成验证码图片插件py

框架引擎

#!/usr/bin/env python
#coding:utf-8

import tornado.ioloop
import tornado.web                              #导入tornado模块下的web文件
import session_lei                              #导入session模块

class dluHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("dlu.html")  #打开登录页面
    def post(self):
        yhm = self.get_argument(‘yhm‘)               #接收用户提交的用户名
        mim = self.get_argument(‘mim‘)               #接收用户提交的密码

class yanzhmaHandler(tornado.web.RequestHandler):
    def get(self):
        #生成图片并且返回
        import io                                       #导入io模块
        import check_code                               #导入验证码图片生成插件
        mstream = io.BytesIO()                          #创建一个BytesIO临时保存生成图片数据
        img,code = check_code.create_validate_code()    #执行图片生成插进里的check_code.create_validate_code类,返回验证码图片生成数据,和字符串验证码
        img.save(mstream,"PNG")                         #将返回的验证码图片数据,添加到BytesIO临时保存
        self.write(mstream.getvalue())                  #从BytesIO临时保存,获取图片返回给img的 src= 进行显示

settings = {                                        #html文件归类配置,设置一个字典
    "template_path":"views",                     #键为template_path固定的,值为要存放HTML的文件夹名称
    "static_path":"statics",                         #键为static_path固定的,值为要存放js和css的文件夹名称
}

#路由映射
application = tornado.web.Application([         #创建一个变量等于tornado.web下的Application方法
    (r"/dlu", dluHandler),
    (r"/yanzhma", yanzhmaHandler),
],**settings)                                   #将html文件归类配置字典,写在路由映射的第二个参数里

if __name__ == "__main__":
    #内部socket运行起来
    application.listen(8888)                    #设置端口
    tornado.ioloop.IOLoop.instance().start()

利用js实现,点击图片刷新验证码,也就是点击一下发送一次验证码请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>请登录</h1>
    <form method="post" action="/dlu">
        用户名<input type="text" name="yhm"/><br/><br/>
        密码<input type="text" name="mim"/><br/><br/>
        验证码<input type="text" name="yanzhma"/><br/><br/>
        <img src="/yanzhma" onclick=‘ChangeCode();‘ id=‘imgCode‘><br/><br/>
        <input type="submit" value="提交"/>
    </form>
    <script type="text/javascript">

        function ChangeCode() {
            var code = document.getElementById(‘imgCode‘);
            code.src += ‘?‘;
        }
    </script>

</body>
</html>

第二、验证码结合Session验证

时间: 2024-10-05 05:32:06

第二百七十节,Tornado框架-生成验证码图片,以及验证码结合Session验证的相关文章

第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time = datetime.now()获取当前时间 在搜索结束后:end_time = datetime.now()获取当前时间 last_time = (end_time-start_time).total_seconds()结束时间减去开始时间等于用时,转换成秒 from django.shortcu

第二百七十一节,Tornado框架-CSRF防止跨站post请求伪造

Tornado框架-CSRF防止跨站post请求伪造 CSRF是什么 CSRF是用来在post请求时做请求验证的,防止跨站post请求伪造 当用户访问一个表单页面时,会自动在表单添加一个隐藏的input标签,name="_xsrf",value="等于一个密串" 当用户post请求提交数据时,会将_xsrf的密串提交到后台,后台会判断这个密串存在就允许提交数据,否则不允许提交 进行CSRF验证只需要两步 1.在框架配置字典里开启CSRF验证,开启后会自动接收post

第二百六十二节,Tornado框架-cookie

Tornado框架-cookie Cookie 是网站用来在客户端保存识别用户的一种小文件.一般来用库可以保存用户登 录信息.购物数据信息等一系列微小信息. self.set_cookie()方法,创建cookie必写参数,cookie名称和cookie值,后面有可选参数self.get_cookie()方法,获取指定cookie值,必写参数要获取的cookie名称 模板引擎 #!/usr/bin/env python #coding:utf-8 import tornado.ioloop im

第二百七十五节,MySQL数据库安装和介绍

MySQL数据库安装 一.概述 1.什么是数据库 ? 答:数据的仓库,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? 答:他们均是一种软件,都有两个主要的功能: a. 将数据保存到文件或内存 b. 接收特定的命令,然后对文件进行相应的操作 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDB

第二百七十四节,同源策略和跨域访问

同源策略和跨域访问  什么是同源策略 尽管浏览器的安全措施多种多样,但是要想黑掉一个Web应用,只要在浏览器的多种安全措施中找到某种措施的一个漏洞或者绕过一种安全措施的方法即可.浏览器的各种保安措施之间都试图保持相互独立,但是攻击者只要能在出错的地方注入少许JavaScript,所有安全控制几乎全部瓦解--最后还起作用的就是最弱的安全防线:同源策略.同源策略管辖着所有保安措施,然而,由于浏览器及其插件,诸如Acrobat Reader.Flash 和Outlook Express漏洞频出,致使同

第二百七十九节,MySQL数据库-pymysql模块

MySQL数据库-pymysql模块 pymysql模块是python操作数据库的一个模块 connect()创建数据库链接,参数是连接数据库需要的连接参数使用方式: 模块名称.connect() 参数: host=数据库ip port=数据库端口 user=数据库用户名 passwd=数据库密码 db=数据库名称 cursor()创建数据库操作游标,无参使用方式: 游标变量.cursor() execute()操作数据库,参数1 sql语句,参数2 字符串占位符变量使用方式: 游标变量.exe

第二百七十六节,MySQL数据库常用命令

MySQL数据库常用命令 1.显示数据库 SHOW DATABASES;显示数据库 SHOW DATABASES; mysql - 用户权限相关数据sys - 数据库的相关配置存放的表information_schema MySQL本身架构相关数据performance_schema主要用于收集数据库服务器性能参数 2.创建数据库 CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 创建一个utf-8编码数据库

第二百七十二、三天 how can I 坚持

昨天加班回来都很晚了,也忘了些日志了.其实感觉加班也没什么啊,一个团队在一块说说闹闹,愉快的完成工作挺好. 今天是2015年的最后一天,2015的愿望啊,只怪自己太怂了.不怂会是什么结果. 其实更应该淡定,淡定了就不怂了. 明天就2016的. 记得上一年这时候,我们应该匆匆忙忙的赶往泉城广场去跨年了,然后夸完年,我和耀哥就开始了一段艰难的回家路啊,半路电动三轮车没电了,推着回的家啊. 2016年新年愿望,结婚,还有能买到自己喜欢的房子,还有一个几乎不可能实现的愿望,当爸爸.好想要个属猴的孩子.

第二百八十节,MySQL数据库-外键链表之一对多

MySQL数据库-外键链表之一对多 外键链表之一对多 外键链表:就是a表通过外键连接b表的主键,建立链表关系 一对多:就是b表的某一个字段值对应a表外键里的多个值,前提是a表要与b表链表