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. 洛谷P3723 [AH2017/HNOI2017]礼物

    吴迪说他化学会考上十分钟就想出来了,太神了%%%不过我也十分钟 但是调了一个多小时啊大草 懒得人话翻译了,自己康吧: 我的室友(真的是室友吗?)最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决 ...

  2. .NET CORE下最快比较两个文件内容是否相同的方法

    本文因为未考虑磁盘缓存, 结果不是很准确, 更严谨的结果请参看本博文的续集 最近项目有个需求,需要比较两个任意大小文件的内容是否相同,要求如下: 项目是.NET CORE,所以使用C#进行编写比较方法 ...

  3. Paper | No-reference Quality Assessment of Deblocked Images

    目录 故事背景 本文方法(DBIQ) 发表在2016年Neurocomputing. 摘要 JPEG is the most commonly used image compression stand ...

  4. FAQ简介

    FAQ:问答系统,Frequently Asked Questions 常见问答系统: FAQ是英文Frequently Asked Questions的缩写,中文意思就是“经常问到的问题”,或者更通 ...

  5. 【Java语言特性学习之五】版本差异新特性

  6. Unreal Engine 4 系列教程 Part 6:动画教程

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  7. Mysql中使用JDBC流式查询避免数据量过大导致OOM

    一.前言 java 中MySQL JDBC 封装了流式查询操作,通过设置几个参数,就可以避免一次返回数据过大导致 OOM. 二.如何使用 2.1 之前查询 public void selectData ...

  8. python asyncio wait和gather

    1. wait, 等待某某执行完成以后才执行下一步 FIRST_COMPLETED = concurrent.futures.FIRST_COMPLETED FIRST_EXCEPTION = con ...

  9. 如何让 C# 在运行时自动选择合适的重载方法?

    如题:假设我们有一段代码: static void Main(string[] args) { ; // 假设这里的 obj 的值来自于外部方法 PrintType(obj); } public st ...

  10. k8s笔记之chartmuseum搭建

    一.下载安装包 #在master节点中执行,以下这条命令就是下载文件到当前目录而已,下载完成之后让我们将chartmuseum赋予权限,就是可执行了chmod chartmuseum,然后移动到/us ...