用 Flask 来写个轻博客 (20) — 实现注册表单与应用 reCAPTCHA 来实现验证码

Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog

目录

前文列表

用 Flask 来写个轻博客 (1) — 创建项目
用 Flask 来写个轻博客 (2) — Hello World!
用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy
用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
用 Flask 来写个轻博客 (5) — (M)VC_SQLAlchemy 的 CRUD 详解
用 Flask 来写个轻博客 (6) — (M)VC_models 的关系(one to many)
用 Flask 来写个轻博客 (7) — (M)VC_models 的关系(many to many)
用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级
用 Flask 来写个轻博客 (9) — M(V)C_Jinja 语法基础快速概览
用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法
用 Flask 来写个轻博客 (11) — M(V)C_创建视图函数
用 Flask 来写个轻博客 (12) — M(V)C_编写和继承 Jinja 模板
用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验
用 Flask 来写个轻博客 (14) — M(V)C_实现项目首页的模板
用 Flask 来写个轻博客 (15) — M(V)C_实现博文页面评论表单
用 Flask 来写个轻博客 (16) — MV(C)_Flask Blueprint 蓝图
用 Flask 来写个轻博客 (17) — MV(C)_应用蓝图来重构项目
用 Flask 来写个轻博客 (18) — 使用工厂模式来生成应用对象
用 Flask 来写个轻博客 (19) — 以 Bcrypt 密文存储账户信息与实现用户登陆表单

reCAPTCHA

CMU 设计了一个名叫 reCAPTCHA 的强大系统,让他们的电脑去向人类求助。具体做法是:将 OCR 软件无法识别的文字扫描图传给世界各大网站,用以替换原来的验证码图片,这些网站的用户在正确识别出这些文字之后,其答案便会被传回CMU。所以 reCAPTCHA 本质上是一个披着验证码皮的分布式文字识别系统(OCR)。

reCAPTCHA 是利用 CAPTCHA(全自动区分计算机和人类的图灵测试) 的原理借助于人类大脑对难以识别的字符的辨别能力,进行对古旧书籍中难以被 OCR 识别的字符进行辨别的技术。也就是说,reCAPTCHA 不仅可以反 spam(垃圾内容),而且同时还可以帮助进行古籍的数字化工作(可以称为人工OCR)。只能说这个创意简直是绝了!所以即便由于 reCAPTCHA 是 Google 的产品在国内无法正常使用,但还是会应用到我们的这个 Blog 项目中,再通过应用反向代理的方式使之成为可行。

使用:reCAPTCHA 的使用起来并不复杂,在注册一个 Google 用户名后,进入到 reCAPTCHA 官网 并输入你的 blog 名(随意填写)和域名(只支持域名和子域名,现在我们暂时使用 localhost,等部署到线上之后也需要将新的域名填入),就会得到一个 Public Key,就可以把它用在你的 reCAPTCHA 插件上了,同时 reCAPTCHA 也支持多个站点。

这里写图片描述

如上图 reCAPTCHA 会告诉你如何将它集成到客户端和服务端。所以建议备份这些信息,尤其是 Public Key 和 <script>

client-side integration
Paste this snippet before the closing tag on your HTML template:

<script src='https://www.google.com/recaptcha/api.js'></script>

Paste this snippet at the end of the where you want the reCAPTCHA widget to appear:

<div class="g-recaptcha" data-sitekey="<your public key>"></div>

Server-side integration:
When your users submit the form where you integrated reCAPTCHA, you’ll get as part of the payload a string with the name “g-recaptcha-response”. In order to check whether Google has verified that user, send a POST request with these parameters:
URL:

https://www.google.com/recaptcha/api/siteverify

应用 reCAPTCHA

  • config.py
class Config(object):
    """Base config class."""
    # WTForm secret key
    SECRET_KEY = 'WTForms key'
    # reCAPTCHA Public key and Private key
    RECAPTCHA_PUBLIC_KEY = "<your public key>"
    RECAPTCHA_PRIVATE_KEY = "<your private key>"
  • forms.py
from flask_wtf import Form, RecaptchaField


class RegisterForm(Form):
    """Register Form."""

    username = StringField('Username', [DataRequired(), Length(max=255)])
    password = PasswordField('Password', [DataRequired(), Length(min=8)])
    comfirm = PasswordField('Confirm Password', [DataRequired(), EqualTo('password')])
    recaptcha = RecaptchaField()

    def validate(self):
        check_validate = super(RegisterForm, self).validate()

        # If validator no pass
        if not check_validate:
            return False

        # Check the user whether already exist.
        user = User.query.filter_by(username=self.username.data).first()
        if user:
            self.username.errors.append('User with that name already exists.')
            return False
        return True
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
首先,你需要在 Flask 应用中配置邮件发送的相关参数,例如邮件服务器地址、端口号、发送者邮箱和密码等。可以使用 Flask-Mail 这个扩展来完成邮件的发送。 接下来,实现注册页面,用户在页面中填需要注册的账号信息,其中包括邮箱地址。当用户提交表后,后端需要生成一个随机的验证码,并将其发送到用户填的邮箱中。 在验证用户填的邮箱是否有效后,可以使用 Flask 的 session 来保存验证码,并将用户重定向到输入验证码的页面。在该页面中,用户需要填之前收到的验证码,并点击提交按钮。 后端需要对用户提交的验证码进行验证,验证通过后,可以将用户输入的账号信息保存到数据库中,并将用户重定向到注册成功页面。如果验证码验证不通过,则需要提示用户重新输入验证码。 以下是一个简Flask 邮箱验证码注册的示例代码: ```python from flask import Flask, render_template, request, session, redirect from flask_mail import Mail, Message import random app = Flask(__name__) app.secret_key = 'your-secret-key' app.config['MAIL_SERVER'] = 'your-mail-server' app.config['MAIL_PORT'] = 465 app.config['MAIL_USE_SSL'] = True app.config['MAIL_USERNAME'] = 'your-mail-username' app.config['MAIL_PASSWORD'] = 'your-mail-password' mail = Mail(app) @app.route('/') def index(): return render_template('register.html') @app.route('/send_code', methods=['POST']) def send_code(): email = request.form['email'] if not email: return '请输入邮箱地址' code = random.randint(100000, 999999) session['code'] = code session['email'] = email msg = Message(subject='验证码', recipients=[email]) msg.body = '您的验证码是:{}'.format(code) mail.send(msg) return '验证码已发送' @app.route('/verify_code', methods=['POST']) def verify_code(): code = request.form['code'] if not code: return '请输入验证码' if 'code' not in session or 'email' not in session: return '验证码已过期,请重新获取' if str(session['code']) != code: return '验证码错误' # 验证通过,进行注册操作 # ... return '注册成功' if __name__ == '__main__': app.run() ``` 在上述代码中,我们定义了三个路由函数,分别用于显示注册页面、发送验证码和验证验证码。在发送验证码时,我们使用了 Flask-Mail 扩展来发送邮件,并将验证码保存在 session 中。在验证用户提交的验证码时,我们需要判断验证码是否过期,并且需要将用户提交的验证码和 session 中保存的验证码进行比对。 需要注意的是,上述代码只是一个简的示例,实际使用中需要进行更多的安全性和可靠性考虑。例如,需要限制用户获取验证码的频率,防止恶意请求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

范桂飓

文章对您有帮助就请一键三连:)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值