BBS论坛(十二)

12.1.图形验证码生成

(1)utils/captcha/init.py

  1. import random
  2. import string
  3. # Image:一个画布
  4. # ImageDraw:一个画笔
  5. # ImageFont:画笔的字体
  6. from PIL import Image,ImageDraw,ImageFont
  7. # pip install pillow
  8.  
  9. # Captcha验证码
  10.  
  11. class Captcha(object):
  12. # 生成几位数的验证码
  13. number = 4
  14. # 验证码图片的宽度和高度
  15. size = (100,30)
  16. # 验证码字体大小
  17. fontsize = 25
  18. # 加入干扰线的条数
  19. line_number = 2
  20.  
  21. # 构建一个验证码源文本
  22. SOURCE = list(string.ascii_letters)
  23. for index in range(0, 10):
  24. SOURCE.append(str(index))
  25.  
  26. #用来绘制干扰线
  27. @classmethod
  28. def __gene_line(cls,draw,width,height):
  29. begin = (random.randint(0, width), random.randint(0, height))
  30. end = (random.randint(0, width), random.randint(0, height))
  31. draw.line([begin, end], fill = cls.__gene_random_color(),width=2)
  32.  
  33. # 用来绘制干扰点
  34. @classmethod
  35. def __gene_points(cls,draw,point_chance,width,height):
  36. chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100]
  37. for w in range(width):
  38. for h in range(height):
  39. tmp = random.randint(0, 100)
  40. if tmp > 100 - chance:
  41. draw.point((w, h), fill=cls.__gene_random_color())
  42.  
  43. # 生成随机的颜色
  44. @classmethod
  45. def __gene_random_color(cls,start=0,end=255):
  46. random.seed()
  47. return (random.randint(start,end),random.randint(start,end),random.randint(start,end))
  48.  
  49. # 随机选择一个字体
  50. @classmethod
  51. def __gene_random_font(cls):
  52. fonts = [
  53. 'msyh.ttf',
  54. 'msyhbd.ttf',
  55. 'simkai.ttf',
  56. 'simsun.ttc',
  57. 'webdings.ttf'
  58. ]
  59. font = random.choice(fonts)
  60. # print(font)
  61. return 'utils/captcha/'+font
  62.  
  63. # 用来随机生成一个字符串(包括英文和数字)
  64. @classmethod
  65. def gene_text(cls, number):
  66. # number是生成验证码的位数
  67. return ''.join(random.sample(cls.SOURCE, number))
  68.  
  69. #生成验证码
  70. @classmethod
  71. def gene_graph_captcha(cls):
  72. # 验证码图片的宽和高
  73. width,height = cls.size
  74. # 创建图片
  75. # R:Red(红色)0-255
  76. # G:G(绿色)0-255
  77. # B:B(蓝色)0-255
  78. # A:Alpha(透明度)
  79. image = Image.new('RGBA',(width,height),cls.__gene_random_color(0,100))
  80. # 验证码的字体
  81. font = ImageFont.truetype(cls.__gene_random_font(),cls.fontsize)
  82. # 创建画笔
  83. draw = ImageDraw.Draw(image)
  84. # 生成字符串
  85. text = cls.gene_text(cls.number)
  86. # 获取字体的尺寸
  87. font_width, font_height = font.getsize(text)
  88. # 填充字符串
  89. draw.text(((width - font_width) / 2, (height - font_height) / 2),text,font= font,fill=cls.__gene_random_color(150,255))
  90. # 绘制干扰线
  91. for x in range(0, cls.line_number):
  92. cls.__gene_line(draw, width, height)
  93. # 绘制噪点
  94. cls.__gene_points(draw, 10, width, height)
  95. # with open('captcha.png','wb') as fp:
  96. # image.save(fp)
  97. return (text,image)

(2)在utils/captcha文件下面放几种字体

(3)front/views.py

  1. @bp.route('/captcha/')
  2. def graph_captcha():
  3. text,image = Captcha.gene_graph_captcha()
  4. out = BytesIO()
  5. image.save(out,'png') #指定格式为png
  6. out.seek(0) #把指针指到开始位置
  7. resp = make_response(out.read())
  8. resp.content_type = 'image/png'
  9. return resp

(4)生成验证码

运行项目,浏览器访问:http://127.0.0.1:5000/captcha/,可以看到生成的随机验证码

12.1.图形验证码生成


12-----BBS论坛的更多相关文章

  1. python 学习笔记二十 django项目bbs论坛

    项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...

  2. Python之路,Day17 - 分分钟做个BBS论坛

    Python之路,Day17 - 分分钟做个BBS论坛   本节内容: 项目:开发一个简单的BBS论坛 需求: 整体参考"抽屉新热榜" + "虎嗅网" 实现不同 ...

  3. LNMP环境搭建BBS论坛及伪静态

    我们在mysql备份 LNMP环境中的数据库迁移为独立的服务器的基础上搭建BBS论坛:  [root@bqh-117 ~]# mysql -uroot -p123456 Welcome to the ...

  4. Python之路【第十八篇】Django小项目简单BBS论坛部分内容知识点

    开发一个简单的BBS论坛 项目需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可被 ...

  5. python第一百三十天 ---简单的BBS论坛

    简单的BBS论坛 实现功能 git仓库地址:https://github.com/uge3/BBS 1.整体参考“抽屉新热榜” + “博客园” 2.实现不同论坛版块 3.帖子列表展示 4.个人博客主页 ...

  6. Django小项目简单BBS论坛

    开发一个简单的BBS论坛 项目需求: 1 整体参考"抽屉新热榜" + "虎嗅网" 2 实现不同论坛版块 3 帖子列表展示 4 帖子评论数.点赞数展示 5 在线用 ...

  7. Python开发一个简单的BBS论坛

    项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...

  8. bbs论坛浏览器兼容性问题

    一直都是在chrome上进行调试,今天终于把bbs论坛这个项目搭建完了,进入IE.Firefox看了看 吓哭了!!! 火狐 Edge chrome 特别是加了<!DOCTYPE html> ...

  9. 开源BBS论坛软件推荐

    七款开源BBS论坛软件推荐(1) 本文介绍了七个开源的BBS论坛软件(在英文界一般叫做Forum).可能国内的朋友们比较熟悉Discuz!和PHPwind,但其实我们的选择还是很多的,而且下面介绍的这 ...

  10. Django项目 BBS论坛

    BBS论坛 一.项目表分析 二.自定义form组件 三.注册功能 四.BBS论坛 登录功能

随机推荐

  1. 在Oracle 12C中使用scott账号

    在Oracle11g中默认是有scott账号的,但在Oracle 12C中则不能直接使用. 我的机器环境: 操作系统:Windows Server 2008 R2 64位 Oracle版本:Oracl ...

  2. Boost log中的几个问题

    1. 使用动态库时,要定义 BOOST_LOG_DYN_LINK  或者 BOOST_ALL_DYN_LINK 否则会出现如下错误: CMakeFiles/xxxx.dir/xxxx.cpp.o: I ...

  3. php学习笔记-关联数组

    传统的数组定义方法如下: <?php $names[0]= 'chinese'; $names[1]= 'math'; $names[2]= 'english'; echo $names[2]; ...

  4. rest-framework组件 之 分页

    分页 简单分页 from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination class PNPag ...

  5. Android中常见的内存泄漏

    为什么会产生内存泄漏? 当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏. ...

  6. const 在C++中的区别

    一.Const作用    如下表所示: No. 作用 说明 参考代码 1 可以定义const常量 const int Max = 100; 2 便于进行类型检查 const常量有数据类型,而宏常量没有 ...

  7. MVC中使用代码创建数据库(code first +mysql+EF)

    1.新建一个mvc项目 2.安装mysql需要的几个文件 EntityFramework.MySql.Data(6.9.12)和MySql.Data.Entity (6.9.12) 这里有几点要注意 ...

  8. c语言判断是否是utf8字符串,计算字符个数

    #include <stdio.h> #include <string.h> #include <stdlib.h> /********************** ...

  9. 根据GridView模板里的列名获取列索引

    以前Insus.NET在写过一篇<在Gridview控件中根据Field Name来取得对应列索引> http://www.cnblogs.com/insus/archive/2010/0 ...

  10. Java打包多文件成zip

    package com.zh.java.util; import lombok.extern.slf4j.Slf4j; import java.io.File;import java.io.FileI ...