看了很多篇生成动态二维码的帖子,但是,都是片段,前言后语都没有.主要研究的这篇
然后自身也不够理解flask基本语言结构,所以头大,

皇天不负有心人,后来看了一些教程,再加上同事小姐姐指导,终究是给跑明白了

当然这个练习只是一个小模块,顶多算是一个网页登录过程的一个小小的组成部分,所以仅作为熟悉练习使用

先看下文件结构

  • joinsuccess.html 用来登陆成功显示的,内容自定
  • login.html 是存储Flask Form的
  • forms.py 是定义了一个类,但后来我把里边的类直接copy进views.py里了,所以这个文件可以忽略
  • validate_picture.py 这个是生成动态验证码的函数
  • view.py 是这个登录网页的主结构

validate_picture.py


from PIL import Image, ImageFont, ImageDraw, ImageFilter
import random
import oscurrent_path = os.path.split(os.path.realpath(__file__))[0]def validate_picture():   #验证码代码函数total = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345789'# 图片大小130 x 50width = 130heighth = 50# 先生成一个新图片对象im = Image.new('RGB', (width, heighth), 'white')# 设置字体font = ImageFont.truetype(current_path + '/simkai.ttf', 37)# 创建draw对象draw = ImageDraw.Draw(im)str = ''# 输出每一个文字for item in range(5):text = random.choice(total)str += textdraw.text((5 + random.randint(4, 7) + 20 * item, 5 + random.randint(3, 7)), text=text, fill='red', font=font)# 划几根干扰线for num in range(8):x1 = random.randint(0, width / 2)y1 = random.randint(0, heighth / 2)x2 = random.randint(0, width)y2 = random.randint(heighth / 2, heighth)draw.line(((x1, y1), (x2, y2)), fill='yellow', width=1)# 模糊下,加个帅帅的滤镜~im = im.filter(ImageFilter.FIND_EDGES)return im, str# ----------------------------if __name__ == '__main__':img,str=validate_picture()print(str)img.show()

view.py (这里边标注的都没删,可以自行删除)

from flask import Flask, render_template, make_response, session
# from utils.code import Code
from validate_picture import validate_picture
from flask import Flask, render_template, request, flash
# 导入wtf扩展的表单类
from flask_wtf import FlaskForm
# 导入自定义表单需要的字段
from wtforms import SubmitField, StringField, PasswordField, BooleanField
# 导入wtf扩展提供的表单验证器
from wtforms.validators import DataRequired, EqualTo
from io import BytesIO
# from PIL import Image, ImageFont, ImageDraw, ImageFilter
# import random
import osauth = Flask(__name__)
# auth.secrete_key='sumer'
auth.config["SECRET_KEY"] = "12345678sumer"class LoginForm(FlaskForm):email = StringField('电子邮箱', validators=[DataRequired()])password = PasswordField('密码', validators=[DataRequired()])verify_code = StringField('验证码', validators=[DataRequired()])remember_me = BooleanField('记住我的用户')submit = SubmitField('登录')current_path = os.path.split(os.path.realpath(__file__))[0]@auth.route('/code')
def get_code():image, code_str = validate_picture()# 将验证码图片以二进制形式写入在内存中, 防止将图片都放在文件夹中,占用大量磁盘buf = BytesIO()image.save(buf, 'jpeg')buf_str = buf.getvalue()# 把二进制作为response发回前端,并设置首部字段response = make_response(buf_str)response.headers['Content-Type'] = 'image/gif'# 将验证码字符串储存在session中session['image'] = code_strreturn response@auth.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()# 1. 判断请求参数if request.method == 'POST':# 2.获取请求参数email = request.form.get('email')password = request.form.get('password')verify_code = request.form.get('verify_code')# 3.验证参数,WTF可以一句话实现所有校验if form.validate_on_submit():# return 'success 'if str.lower(session.get('image')) != str.lower(verify_code):print(session.get('image'))flash('验证码错误')if str.lower(session.get('image')) == str.lower(verify_code):return render_template('joinsuccess.html')# user = User.query.filter_by(email=form.email.data).first()# # 验证用户的登录密码# if user is not None and user.verify_password(form.password.data):#     login_user(user, form.remember_me.data)#     flash('验证通过,登录成功')#     return redirect(request.args.get('next') or#                     url_for('main.index'))else:flash('用户名或者密码不正确')return render_template('login.html', form=form)@auth.route('/')
def hello():return '''\n\n\n<h3>隐藏扫一扫助力!<br></h1><img src="https://github.com/rovesoul/PyTorch-Chinese-Guide/blob/master/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202019-10-20%20%E4%B8%8B%E5%8D%8810.50.07.png?raw=true"><br><br><a href="http://127.0.0.1:5000/login">--点击进行验证码登录--</a><br><br>查看登录页面,需要在上方地址栏补加入 login <br>再回车就能进入了.<br>因为在views的login调用页面函数里,是/login'''if __name__ == "__main__":auth.run(debug=True)p=get_code()print(type(response))

login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8">
{#     <title>二维码测试</title> #}</head>
<body>{#   extends "base.html" #}
{#   import "bootstrap/wtf.html" as wtf #}{% block page_content %}<div class="page-header"><h1>Login</h1></div><form method="post">{{ form.csrf_token() }}{{ form.email.label }}<br>{{ form.email }}<br>{{ form.password.label }}<br>{{ form.password }}<br>{{ form.verify_code.label }}<br>{{ form.verify_code }}<br>{{ form.remember_me.label }}<br>{{ form.submit }}<br></form><div class="col-md-4"><!--点击图片重新获取验证码--><img  src="/code " onclick="this.src='/code?'+ Math.random()"></div>{% endblock %}</body>
</html>

joinsuccess.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登陆成功</title>
</head>
<body>
<h1>success </h1>
</body>
</html>

最终登录页面如此:


祝学习,玩的愉快~

Flask 生成动态二维码登录相关推荐

  1. python小工具myqr生成动态二维码

    python小工具myqr生成动态二维码 (一)安装 (二)使用 (一)安装 命令: pip install myqr 安装完成后,就可以在命令行中输入 myqr 查看下使用帮助: myqr --he ...

  2. python myqr制作二维码生成器_用Python生成动态二维码,只要5行代码,拥有你的个性二维码!...

    原标题:用Python生成动态二维码,只要5行代码,拥有你的个性二维码! 前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. P ...

  3. Python生成动态二维码,只需几行代码,这也太有意思了~

    兄der们,今天我们试试只用几行代码,生成动态二维码! 来吃够~ 模块相关 我们要用到的是,MyQR这个库, 当然,最直接的方式,就是pip install pip install MyQR 参数讲解 ...

  4. python使用第三方库MyQR实现生成动态二维码

    使用python第三方库:MyQR GitHub地址: https://github.com/sylnsfar/qrcode 步骤: 1.安装myqr pip install MyQR 1.2 准备需 ...

  5. python生成动态二维码实例_python生成动态个性二维码(示例代码)

    1 安装工具 2 生成普通二维码 3 带图片的二维码 4 动态 GIF 二维码 5 在Python程序中使用 一.安装 首先在python环境下运行, 打开cmd进入python27 进入script ...

  6. Python生成动态二维码,运用神库:qrcode

    一.介绍 1.1 二维码 二维码又称二维条码,常见的二维码为 QR Code,QR 全称 Quick Response.是一个近几年来移动设备上超流行的一种编码方式,在现在的生活中二维码随处可见.我们 ...

  7. 用Python生成动态二维码,只要5行代码,拥有你的个性二维码!

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 ...

  8. Python生成动态二维码,又掌握了一个小技巧

    有点无聊,用Python来生成一个动态二维码吧,只需要几行代码~ 模块相关 我们要用到的是,MyQR这个库, 当然,最直接的方式,就是pip install pip install MyQR 参数讲解 ...

  9. 几行代码Python生成动态二维码,毕设靠它加分啦~

    嗨害大家好鸭!我是小熊猫❤ 模块相关 我们要用到的是,MyQR这个库, 当然,最直接的方式,就是pip install pip install MyQR 参数讲解 在使用前,我们先了解MyQR的几个参 ...

最新文章

  1. Java 日志体系详解
  2. 通过缓存数据库结果提高PHP性能(转)
  3. VTK:迭代最近点变换用法实战
  4. 小甲鱼python课件源代码_[Python基础] 小甲鱼零基础入门Python学习视频+全套源码课件 Python视频教程 96讲...
  5. (8)css常用样式属性3
  6. 20179301《网络攻防实践》第九周作业
  7. BeanUtils工具包下载及应用
  8. MySQL学习记录 (三) ----- SQL数据定义语句(DDL)
  9. 深度学习图片卷积输出大小计算公式
  10. 增长量计算n+1原则_资料分析听课笔记
  11. 一种基于折射反向学习机制与自适应控制因子的改进樽海鞘群算法
  12. R语言 相关性的显著性检验
  13. 虚拟机u盾怎么使用_Linux下如何使用网银
  14. 轩逸android 苹果 蓝牙,【图】Iphone与轩逸车载蓝牙连接的小技巧
  15. 植物野外识别速查图鉴
  16. 【大白菜】介绍几个维护U盘安全的技巧
  17. Linux安装Siege
  18. 元岛屋日式烤肉,这个夏天你怎可错过!
  19. DataGridView获取当前选中的行与列的值
  20. 麦克风阵列之一阶差分麦克风阵列

热门文章

  1. 树莓派4b连接WiFi或者热点 + 换源——华为云 + 安装conda
  2. 今天520,要及时「缓存」你们的珍贵时光。
  3. 传奇脚本_传奇传送员脚本
  4. 叶罗丽颜值测试软件齐娜多少分,叶罗丽里最好看的5对翅膀, 蓝孔雀翅膀排名垫底, 第一名竟是齐娜...
  5. python五子棋界面_python实现的控制台五子棋
  6. js 监听手机输入法弹出
  7. html背景图片循环自动播放,CSS动画实现背景无缝无限循环的实现示例
  8. Oracle 批量update语句,Oracle之update语句优化研究 批量更新
  9. H5中attr属性的使用,伪元素,阴影
  10. 哈夫曼编码(文件编码与解码)