📜  构建 Flask 应用程序以验证 CAPTCHA

📅  最后修改于: 2022-05-13 01:55:31.014000             🧑  作者: Mango

构建 Flask 应用程序以验证 CAPTCHA

在本文中,我们将构建一个可以具有 CAPTCHA 的 Web 应用程序。 CAPTCHA 是一种可用于区分真实用户和自动用户的工具。验证码通常位于登录页面或支付页面上。

什么是验证码?

验证码是用于确保网站免受垃圾邮件攻击的策略。目标是通过筛选自然创建的输入来防止直观的网站被垃圾邮件。缩写 CAPTCHA 的意思是“完全自动化的公共图灵测试以区分计算机和人类”。当 Web 应用程序需要客户端输入时,通常会使用验证码。设想您正在经营在线商店,并且需要为您的客户提供在评论部分撰写项目调查的机会。对于这种情况,您需要保证段落确实来自您的客户,或者如果没有其他内容来自人类站点的访客。您会定期查看自然产生的垃圾评论——在大多数与您的反对派相关的悲观情景中。

注意:有关更多信息,请参阅什么是 CAPTCHA 代码?

要求

  • Flask 框架: Flask 是Python的 API,它允许我们构建 Web 应用程序。 Flask 的框架比 Django 的框架更明确,也更容易学习,因为它实现一个简单的 web 应用程序的基础代码更少。
  • Flask-session-captcha 库:使用flask-sessionstore 和captcha 包的flask 验证码实现。每个验证码挑战答案都保存在被挑战客户端的服务器端会话中。
  • MongoDB: MongoDB 是最流行的 NoSQL 数据库,是一个开源的面向文档的数据库。术语“NoSQL”意味着“非关系”。这意味着 MongoDB 不是基于类似表的关系数据库结构,而是提供了一种完全不同的数据存储和检索机制。

注意:数据库取决于您的应用程序。 Flask-session-captcha 库支持多个数据库,因此如果您使用任何其他数据库,请务必查看他们的文档。

构建应用程序

您可以使用以下命令安装所有必需的依赖项



建议您在虚拟环境中安装所有依赖项。

分步实施

第 1 步:创建 UI

创建一个名为模板的文件夹,并在其中创建一个 HTML 文件。您可以将 HTML 文件保存为 form.html。

HTML
              {{ captcha() }}          


Python3
from flask import Flask,render_template
  
app = Flask(__name__)
  
@app.route('/')
def index():
    return render_template('form.html')
    
if __name__ == "__main__":
    app.run(debug=True)


Python3
from flask import Flask, render_template
from pymongo import MongoClient
  
app = Flask(__name__)
  
# Database Config
# If your mongodb runs on a different port
# change 27017 to that port number
mongoClient = MongoClient('localhost', 27017)
  
@app.route('/')
def index():
    return render_template('form.html')
  
if __name__ == "__main__":
    app.run(debug=True)


Python3
import uuid
from flask import Flask, render_template
from flask_sessionstore import Session
from flask_session_captcha import FlaskSessionCaptcha
from pymongo import MongoClient
  
app = Flask(__name__)
  
# Database Config
# If your mongodb runs on a different port
# change 27017 to that port number
mongoClient = MongoClient('localhost', 27017)
  
# Captcha Configuration
app.config["SECRET_KEY"] = uuid.uuid4()
app.config['CAPTCHA_ENABLE'] = True
  
# Set 5 as character length in captcha
app.config['CAPTCHA_LENGTH'] = 5
  
# Set the captcha height and width
app.config['CAPTCHA_WIDTH'] = 160
app.config['CAPTCHA_HEIGHT'] = 60
app.config['SESSION_MONGODB'] = mongoClient
app.config['SESSION_TYPE'] = 'mongodb'
  
# Enables server session
Session(app)
  
# Initialize FlaskSessionCaptcha
captcha = FlaskSessionCaptcha(app)
  
@app.route('/')
def index():
    return render_template('form.html')
  
if __name__ == "__main__":
    app.run(debug=True)


Python3
import uuid
import logging
from flask import Flask, render_template
from flask_sessionstore import Session
from flask_session_captcha import FlaskSessionCaptcha
from pymongo import MongoClient
  
app = Flask(__name__)
  
# Database Config
# If your mongodb runs on a different port
# change 27017 to that port number
mongoClient = MongoClient('localhost', 27017)
  
# Captcha Configuration
app.config["SECRET_KEY"] = uuid.uuid4()
app.config['CAPTCHA_ENABLE'] = True
  
# Set 5 as character length in captcha
app.config['CAPTCHA_LENGTH'] = 5
  
# Set the captcha height and width
app.config['CAPTCHA_WIDTH'] = 160
app.config['CAPTCHA_HEIGHT'] = 60
app.config['SESSION_MONGODB'] = mongoClient
app.config['SESSION_TYPE'] = 'mongodb'
  
# Enables server session
Session(app)
  
# Initialize FlaskSessionCaptcha
captcha = FlaskSessionCaptcha(app)
  
@app.route('/')
def index():
    return render_template('form.html')
  
  
if __name__ == "__main__":
    app.debug = True
    logging.getLogger().setLevel("DEBUG")
    app.run()


Python3
import uuid
import logging
from flask import Flask, request, render_template
from flask_sessionstore import Session
from flask_session_captcha import FlaskSessionCaptcha
from pymongo import MongoClient
  
app = Flask(__name__)
  
# Database Config
# If your mongodb runs on a different port
# change 27017 to that port number
mongoClient = MongoClient('localhost', 27017)
  
# Captcha Configuration
app.config["SECRET_KEY"] = uuid.uuid4()
app.config['CAPTCHA_ENABLE'] = True
  
# Set 5 as character length in captcha
app.config['CAPTCHA_LENGTH'] = 5
  
# Set the captcha height and width
app.config['CAPTCHA_WIDTH'] = 160
app.config['CAPTCHA_HEIGHT'] = 60
app.config['SESSION_MONGODB'] = mongoClient
app.config['SESSION_TYPE'] = 'mongodb'
  
# Enables server session
Session(app)
  
# Initialize FlaskSessionCaptcha
captcha = FlaskSessionCaptcha(app)
  
@app.route('/', methods=['POST', 'GET'])
def index():
    if request.method == "POST":
        if captcha.validate():
            return "success"
        else:
            return "fail"
  
    return render_template("form.html")
  
  
if __name__ == "__main__":
    app.debug = True
    logging.getLogger().setLevel("DEBUG")
    app.run()


第 2 步:创建 app.py

让我们创建一个简单的应用程序,显示没有验证码的上述表单。

示例:初始化 Flask 应用程序

蟒蛇3

from flask import Flask,render_template
  
app = Flask(__name__)
  
@app.route('/')
def index():
    return render_template('form.html')
    
if __name__ == "__main__":
    app.run(debug=True)

使用以下命令运行服务器以确保应用程序运行成功并显示 form.html 页面。

python app.py

输出:



第 3 步:初始化 PyMongoClient

要在 MongoDB 中使用Python ,我们将导入 PyMongo。从中,可以导入 MongoClient 用于创建一个客户端到数据库。

蟒蛇3

from flask import Flask, render_template
from pymongo import MongoClient
  
app = Flask(__name__)
  
# Database Config
# If your mongodb runs on a different port
# change 27017 to that port number
mongoClient = MongoClient('localhost', 27017)
  
@app.route('/')
def index():
    return render_template('form.html')
  
if __name__ == "__main__":
    app.run(debug=True)

第 4 步:配置验证码

在应用程序中使用验证码需要进行各种配置。在这里,我们将使用 flask_session_captcha 模块,该模块使用 flak-sessionstore 和 captcha 包实现验证码。

蟒蛇3

import uuid
from flask import Flask, render_template
from flask_sessionstore import Session
from flask_session_captcha import FlaskSessionCaptcha
from pymongo import MongoClient
  
app = Flask(__name__)
  
# Database Config
# If your mongodb runs on a different port
# change 27017 to that port number
mongoClient = MongoClient('localhost', 27017)
  
# Captcha Configuration
app.config["SECRET_KEY"] = uuid.uuid4()
app.config['CAPTCHA_ENABLE'] = True
  
# Set 5 as character length in captcha
app.config['CAPTCHA_LENGTH'] = 5
  
# Set the captcha height and width
app.config['CAPTCHA_WIDTH'] = 160
app.config['CAPTCHA_HEIGHT'] = 60
app.config['SESSION_MONGODB'] = mongoClient
app.config['SESSION_TYPE'] = 'mongodb'
  
# Enables server session
Session(app)
  
# Initialize FlaskSessionCaptcha
captcha = FlaskSessionCaptcha(app)
  
@app.route('/')
def index():
    return render_template('form.html')
  
if __name__ == "__main__":
    app.run(debug=True)

步骤 5:配置日志记录

日志记录是一种跟踪某些软件运行时发生的事件的方法。这里我们使用了 logging.getLogger() 方法,该方法返回具有指定名称的记录器,否则返回根记录器,

蟒蛇3

import uuid
import logging
from flask import Flask, render_template
from flask_sessionstore import Session
from flask_session_captcha import FlaskSessionCaptcha
from pymongo import MongoClient
  
app = Flask(__name__)
  
# Database Config
# If your mongodb runs on a different port
# change 27017 to that port number
mongoClient = MongoClient('localhost', 27017)
  
# Captcha Configuration
app.config["SECRET_KEY"] = uuid.uuid4()
app.config['CAPTCHA_ENABLE'] = True
  
# Set 5 as character length in captcha
app.config['CAPTCHA_LENGTH'] = 5
  
# Set the captcha height and width
app.config['CAPTCHA_WIDTH'] = 160
app.config['CAPTCHA_HEIGHT'] = 60
app.config['SESSION_MONGODB'] = mongoClient
app.config['SESSION_TYPE'] = 'mongodb'
  
# Enables server session
Session(app)
  
# Initialize FlaskSessionCaptcha
captcha = FlaskSessionCaptcha(app)
  
@app.route('/')
def index():
    return render_template('form.html')
  
  
if __name__ == "__main__":
    app.debug = True
    logging.getLogger().setLevel("DEBUG")
    app.run()

第 6 步:编码索引路由

在这里,我们使用了 POST 方法,该方法根据验证码返回检查输入。如果验证码匹配,则显示成功方法,否则显示失败方法。

蟒蛇3

import uuid
import logging
from flask import Flask, request, render_template
from flask_sessionstore import Session
from flask_session_captcha import FlaskSessionCaptcha
from pymongo import MongoClient
  
app = Flask(__name__)
  
# Database Config
# If your mongodb runs on a different port
# change 27017 to that port number
mongoClient = MongoClient('localhost', 27017)
  
# Captcha Configuration
app.config["SECRET_KEY"] = uuid.uuid4()
app.config['CAPTCHA_ENABLE'] = True
  
# Set 5 as character length in captcha
app.config['CAPTCHA_LENGTH'] = 5
  
# Set the captcha height and width
app.config['CAPTCHA_WIDTH'] = 160
app.config['CAPTCHA_HEIGHT'] = 60
app.config['SESSION_MONGODB'] = mongoClient
app.config['SESSION_TYPE'] = 'mongodb'
  
# Enables server session
Session(app)
  
# Initialize FlaskSessionCaptcha
captcha = FlaskSessionCaptcha(app)
  
@app.route('/', methods=['POST', 'GET'])
def index():
    if request.method == "POST":
        if captcha.validate():
            return "success"
        else:
            return "fail"
  
    return render_template("form.html")
  
  
if __name__ == "__main__":
    app.debug = True
    logging.getLogger().setLevel("DEBUG")
    app.run()

运行应用程序

启动服务器:

python app.py

然后访问:

http://localhost:5000/

输出: