12-----BBS论坛
BBS论坛(十二)
12.1.图形验证码生成
(1)utils/captcha/init.py
- import random
- import string
- # Image:一个画布
- # ImageDraw:一个画笔
- # ImageFont:画笔的字体
- from PIL import Image,ImageDraw,ImageFont
- # pip install pillow
- # Captcha验证码
- class Captcha(object):
- # 生成几位数的验证码
- number = 4
- # 验证码图片的宽度和高度
- size = (100,30)
- # 验证码字体大小
- fontsize = 25
- # 加入干扰线的条数
- line_number = 2
- # 构建一个验证码源文本
- SOURCE = list(string.ascii_letters)
- for index in range(0, 10):
- SOURCE.append(str(index))
- #用来绘制干扰线
- @classmethod
- def __gene_line(cls,draw,width,height):
- begin = (random.randint(0, width), random.randint(0, height))
- end = (random.randint(0, width), random.randint(0, height))
- draw.line([begin, end], fill = cls.__gene_random_color(),width=2)
- # 用来绘制干扰点
- @classmethod
- def __gene_points(cls,draw,point_chance,width,height):
- 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=cls.__gene_random_color())
- # 生成随机的颜色
- @classmethod
- def __gene_random_color(cls,start=0,end=255):
- random.seed()
- return (random.randint(start,end),random.randint(start,end),random.randint(start,end))
- # 随机选择一个字体
- @classmethod
- def __gene_random_font(cls):
- fonts = [
- 'msyh.ttf',
- 'msyhbd.ttf',
- 'simkai.ttf',
- 'simsun.ttc',
- 'webdings.ttf'
- ]
- font = random.choice(fonts)
- # print(font)
- return 'utils/captcha/'+font
- # 用来随机生成一个字符串(包括英文和数字)
- @classmethod
- def gene_text(cls, number):
- # number是生成验证码的位数
- return ''.join(random.sample(cls.SOURCE, number))
- #生成验证码
- @classmethod
- def gene_graph_captcha(cls):
- # 验证码图片的宽和高
- width,height = cls.size
- # 创建图片
- # R:Red(红色)0-255
- # G:G(绿色)0-255
- # B:B(蓝色)0-255
- # A:Alpha(透明度)
- image = Image.new('RGBA',(width,height),cls.__gene_random_color(0,100))
- # 验证码的字体
- font = ImageFont.truetype(cls.__gene_random_font(),cls.fontsize)
- # 创建画笔
- draw = ImageDraw.Draw(image)
- # 生成字符串
- text = cls.gene_text(cls.number)
- # 获取字体的尺寸
- font_width, font_height = font.getsize(text)
- # 填充字符串
- draw.text(((width - font_width) / 2, (height - font_height) / 2),text,font= font,fill=cls.__gene_random_color(150,255))
- # 绘制干扰线
- for x in range(0, cls.line_number):
- cls.__gene_line(draw, width, height)
- # 绘制噪点
- cls.__gene_points(draw, 10, width, height)
- # with open('captcha.png','wb') as fp:
- # image.save(fp)
- return (text,image)

(2)在utils/captcha文件下面放几种字体
(3)front/views.py
- @bp.route('/captcha/')
- def graph_captcha():
- text,image = Captcha.gene_graph_captcha()
- out = BytesIO()
- image.save(out,'png') #指定格式为png
- out.seek(0) #把指针指到开始位置
- resp = make_response(out.read())
- resp.content_type = 'image/png'
- return resp
(4)生成验证码
运行项目,浏览器访问:http://127.0.0.1:5000/captcha/,可以看到生成的随机验证码
- 12.1.图形验证码生成
12-----BBS论坛的更多相关文章
- python 学习笔记二十 django项目bbs论坛
项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...
- Python之路,Day17 - 分分钟做个BBS论坛
Python之路,Day17 - 分分钟做个BBS论坛 本节内容: 项目:开发一个简单的BBS论坛 需求: 整体参考"抽屉新热榜" + "虎嗅网" 实现不同 ...
- LNMP环境搭建BBS论坛及伪静态
我们在mysql备份 LNMP环境中的数据库迁移为独立的服务器的基础上搭建BBS论坛: [root@bqh-117 ~]# mysql -uroot -p123456 Welcome to the ...
- Python之路【第十八篇】Django小项目简单BBS论坛部分内容知识点
开发一个简单的BBS论坛 项目需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可被 ...
- python第一百三十天 ---简单的BBS论坛
简单的BBS论坛 实现功能 git仓库地址:https://github.com/uge3/BBS 1.整体参考“抽屉新热榜” + “博客园” 2.实现不同论坛版块 3.帖子列表展示 4.个人博客主页 ...
- Django小项目简单BBS论坛
开发一个简单的BBS论坛 项目需求: 1 整体参考"抽屉新热榜" + "虎嗅网" 2 实现不同论坛版块 3 帖子列表展示 4 帖子评论数.点赞数展示 5 在线用 ...
- Python开发一个简单的BBS论坛
项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...
- bbs论坛浏览器兼容性问题
一直都是在chrome上进行调试,今天终于把bbs论坛这个项目搭建完了,进入IE.Firefox看了看 吓哭了!!! 火狐 Edge chrome 特别是加了<!DOCTYPE html> ...
- 开源BBS论坛软件推荐
七款开源BBS论坛软件推荐(1) 本文介绍了七个开源的BBS论坛软件(在英文界一般叫做Forum).可能国内的朋友们比较熟悉Discuz!和PHPwind,但其实我们的选择还是很多的,而且下面介绍的这 ...
- Django项目 BBS论坛
BBS论坛 一.项目表分析 二.自定义form组件 三.注册功能 四.BBS论坛 登录功能
随机推荐
- 在Oracle 12C中使用scott账号
在Oracle11g中默认是有scott账号的,但在Oracle 12C中则不能直接使用. 我的机器环境: 操作系统:Windows Server 2008 R2 64位 Oracle版本:Oracl ...
- Boost log中的几个问题
1. 使用动态库时,要定义 BOOST_LOG_DYN_LINK 或者 BOOST_ALL_DYN_LINK 否则会出现如下错误: CMakeFiles/xxxx.dir/xxxx.cpp.o: I ...
- php学习笔记-关联数组
传统的数组定义方法如下: <?php $names[0]= 'chinese'; $names[1]= 'math'; $names[2]= 'english'; echo $names[2]; ...
- rest-framework组件 之 分页
分页 简单分页 from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination class PNPag ...
- Android中常见的内存泄漏
为什么会产生内存泄漏? 当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏. ...
- const 在C++中的区别
一.Const作用 如下表所示: No. 作用 说明 参考代码 1 可以定义const常量 const int Max = 100; 2 便于进行类型检查 const常量有数据类型,而宏常量没有 ...
- MVC中使用代码创建数据库(code first +mysql+EF)
1.新建一个mvc项目 2.安装mysql需要的几个文件 EntityFramework.MySql.Data(6.9.12)和MySql.Data.Entity (6.9.12) 这里有几点要注意 ...
- c语言判断是否是utf8字符串,计算字符个数
#include <stdio.h> #include <string.h> #include <stdlib.h> /********************** ...
- 根据GridView模板里的列名获取列索引
以前Insus.NET在写过一篇<在Gridview控件中根据Field Name来取得对应列索引> http://www.cnblogs.com/insus/archive/2010/0 ...
- Java打包多文件成zip
package com.zh.java.util; import lombok.extern.slf4j.Slf4j; import java.io.File;import java.io.FileI ...