tornado随机生成图片验证码

用python生成随机验证码需要借鉴一个插件,和一个io模块,实现起来也非常容易,当然也需要借鉴session来判断验证码是否错误,下面写一段用户登录验证带验证码的。

一、目录结构

二、login.html

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>欢迎登录</h1>
<form method="POST", action="/login" enctype="multipart/form-data">
<p><input name="username" type="text" placeholder="用户名"></p>
<p><input name="pwd" type="password" placeholder="密码"></p>
<p>
<input name="code" type="text" placeholder="验证码">
<img src="/check_code" onclick="ChangeCode();" id="imgCode">
</p>
<input type="submit" value="登录"/>
<span style="color: red">{{state}}</span>
</form> <script type="text/javascript">
function ChangeCode() { //当点击图片的时候,会刷新图片,这一段代码就可以实现
var code = document.getElementById('imgCode');
code.src += '?';
} </script> </body>
</html>

三、app.py

 #!/usr/bin/env python
# -*- coding: utf- -*-
import tornado.ioloop
import tornado.web
import io
import check_code container = {}
class Session:
def __init__(self, handler):
self.handler = handler
self.random_str = None def __genarate_random_str(self):
import hashlib
import time
obj = hashlib.md5()
obj.update(bytes(str(time.time()), encoding='utf-8'))
random_str = obj.hexdigest()
return random_str def __setitem__(self, key, value):
#在container中加入随机字符串
#定义专属于自己的数据
#在客户端中写入随机字符串
#判断,请求的用户是否已有随机字符串
if not self.random_str:
random_str = self.handler.get_cookie('__session__')
if not random_str:
random_str = self.__genarate_random_str()
container[random_str] = {}
else:
#客户端有随机字符串
if random_str in container.keys():
pass
else:
random_str = self.__genarate_random_str()
container[random_str] = {}
self.random_str = random_str container[self.random_str][key] = value
self.handler.set_cookie("__session__", self.random_str) def __getitem__(self, key):
#获取客户端的随机字符串
#从container中获取专属于自己的数据
#专属信息[key]
random_str = self.handler.get_cookie("__session__")
if not random_str:
return None
#客户端有随机字符串
user_info_dict = container.get(random_str, None)
if not user_info_dict:
return None
value = user_info_dict.get(key, None)
return value class BaseHandler(tornado.web.RequestHandler):
def initialize(self):
self.session = Session(self) class LoginHandler(BaseHandler):
def get(self, *args, **kwargs):
self.render('login.html', state='') def post(self, *args, **kwargs):
username = self.get_argument('username', None)
pwd = self.get_argument('pwd', None)
code = self.get_argument('code')
check_code = self.session['CheckCode']
if username == 'admin' and pwd == '' and code.upper() == check_code.upper():
self.write('登录成功')
else:
self.render('login.html', state='用户信息或验证码不正确') class CheckCodeHandler(BaseHandler):
def get(self, *args, **kwargs):
mstream = io.BytesIO()
img, code = check_code.create_validate_code()
img.save(mstream, "GIF")
self.session['CheckCode'] = code
print(mstream.getvalue())
self.write(mstream.getvalue()) settings = {
'template_path': 'views',
'static_path': 'static',
'cookie_secret': 'hafhdahqahefihdkasfka',
} application = tornado.web.Application([
(r"/login", LoginHandler),
(r"/check_code", CheckCodeHandler),
], **settings) if __name__ == "__main__":
application.listen()
tornado.ioloop.IOLoop.instance().start()

四、check_code.py 和 Monaco.ttf 是一个插件,需要跟app.py放在同一个目录下。

五、运行结果图示

web框架--tornado之验证码实例的更多相关文章

  1. Python Web框架 tornado 异步原理

    Python Web框架 tornado 异步原理 参考:http://www.jb51.net/article/64747.htm 待整理

  2. Python web框架 Tornado异步非阻塞

    Python web框架 Tornado异步非阻塞   异步非阻塞 阻塞式:(适用于所有框架,Django,Flask,Tornado,Bottle) 一个请求到来未处理完成,后续一直等待 解决方案: ...

  3. 第一个web框架tornado

    简介 tornado,是我学到的第一个web框架是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google ...

  4. Python web框架 Tornado(一)基础学习

    概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...

  5. Python Web框架Tornado的异步处理代码演示样例

    1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与还有一个流行的Python web框架Django相比.tornado不提供操作数据库的ORM接口 ...

  6. 关于Python Web框架——Tornado

    关于Tornado的入门看这篇文章,写的非常好: https://zhuanlan.zhihu.com/p/37382503 Tornado 是一个Python web框架和异步网络库,使用非阻塞网络 ...

  7. 异步非阻塞IO的Python Web框架--Tornado

    Tornado的全称是Torado Web Server,从名字上就可知它可用作Web服务器,但同时它也是一个Python Web的开发框架.最初是在FriendFeed公司的网站上使用,FaceBo ...

  8. Python web框架——Tornado

    Tornado是一个Python Web框架和异步网络库,最初由FriendFeed开发.通过使用非阻塞网络I / O,Tornado可以扩展到数万个开放连接,使其成为需要长时间连接每个用户的长轮询, ...

  9. Python web框架 Tornado(三)自定义session组件

    我们在学习Django框架的过程中,内部封装了session组件,以方便于我们使用进行验证.但是Tornado框架是没有session的,所以如果想使用session的话,就需要我们自己定制相对应的组 ...

随机推荐

  1. python进阶之命名空间与作用域

    命名空间 Namespace Namespace命名空间,命名空间是一个字典(dictionary),它的键就是变量名,它的值就是那些变量的值.命名空间的一大作用是避免名字冲突. python使用命名 ...

  2. QTreeWidgetItem清空子节点

    下面列出,xxbs遇到的注意点儿: 1. QTreeWidget::collapseAll(); //xxbs::先折叠所有根项. 如果某个根是展开的,先删除根的子项再折叠,展开的凸显状态角色无法清除 ...

  3. HTML+CSS基础 并集选择器

    并集选择器.a,.b

  4. vue中toggle切换的3种写法

    前言:查看下面代码,在任意编辑器中直接复制粘贴运行即可 1:非动态组件(全局注册2个组件,借用v-if指令和三元表达式) <!DOCTYPE html> <html> < ...

  5. 1.go语言入门

    1.Go语言中文网,选择相应版本(32位或64位)下载 https://studygolang.com/dl, 2.解压到一个任意文件夹 3.配置环境变量 cmd命令行输入go version查看当前 ...

  6. 一个简单的 WPF 程序,用于显示实时时间

    直接贴代码了: TimeShowerWindow.xaml <Window x:Class="HelloWorld.TimeShowerWindow" xmlns=" ...

  7. Kafka学习笔记之Kafka High Availability(上)

    0x00 摘要 Kafka在0.8以前的版本中,并不提供High Availablity机制,一旦一个或多个Broker宕机,则宕机期间其上所有Partition都无法继续提供服务.若该Broker永 ...

  8. winfrom 获取焦点控件

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Win ...

  9. 理解类、对象、实例、原型链以及继承 - WPF特工队内部资料

    理解类.对象.实例.原型链以及继承 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  10. Linux管道及重定向

    Linux管道及重定向 对shell有一定了解的人都知道,管道和重定向是 Linux 中非常实用的 IPC 机制.在shell中,我们通常使用符合'|'来表示管道,符号'>'和'<'表示重 ...