Django中使用pillow实现登录验证码功能(带刷新验证码功能)

以下是详细讲解“Django中使用pillow实现登录验证码功能(带刷新验证码功能)”的完整攻略,包含两条示例说明:

1. 安装pillow库

在Django中使用pillow来生成验证码实现登录验证功能,首先需要安装pillow库。可以通过以下命令在终端中安装:

pip install pillow

2. 修改app.views.py文件

在app.views.py文件中添加生成验证码的函数generate_captcha()。

from PIL import Image, ImageDraw, ImageFont
import random, string

def generate_captcha():
    # 随机生成字符串
    captcha_text = ''.join(random.sample(string.ascii_letters + string.digits, 4))
    # 设置图片尺寸
    img_size = (100, 30)
    # 设置字体
    font = ImageFont.truetype("arial.ttf", 28)
    # 设置背景颜色
    bg_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
    # 设置字体颜色
    font_color = (255, 255, 255)
    # 创建画布
    img = Image.new(mode="RGB", size=img_size, color=bg_color)
    draw = ImageDraw.Draw(img)
    # 将验证码字符串写到画布上
    draw.text((10, 0), captcha_text, font=font, fill=font_color)
    # 噪点干扰
    for i in range(random.randint(120,130)):
        draw.point([random.randint(0,img_size[0]),random.randint(0,img_size[1])],fill=(0,0,0))
    # 画框
    draw.rectangle([1,1,img_size[0]-1,img_size[1]-1],outline=(255,255,255))
    # 将生成的验证码图片保存
    img.save('app/captcha.png', 'PNG')
    # 返回验证码字符串
    return captcha_text

3. 修改app.urls.py文件

在app.urls.py文件中,修改路径为/captcha/,视图调用函数为generate_captcha()。

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('captcha/', views.generate_captcha, name='captcha'),
]

4. 修改login.html文件

在login.html文件中,添加img标签和a标签用于刷新验证码。

<!DOCTYPE html>
<html>
<head>
    <title>login</title>
</head>
<body>
    <form>
        <label for="username">Username:</label><br>
        <input type="text" id="username" name="username"><br>
        <label for="password">Password:</label><br>
        <input type="password" id="password" name="password"><br>
        <img src="{% url 'captcha' %}" id="captcha"><br>
        <a href="javascript:void(0)" onclick="document.getElementById('captcha').src='{% url 'captcha' %}?'+Math.random()">刷新</a>
        <br>
        <label for="captcha_input">Captcha:</label><br>
        <input type="text" id="captcha_input" name="captcha_input"><br>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

5. 在views.py文件中添加login()函数

在views.py文件中添加login()函数用于验证用户输入的用户名、密码和验证码是否正确。

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login

def login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        captcha_input = request.POST['captcha_input']
        captcha_text = request.session.get('captcha_text')
        user = authenticate(request, username=username, password=password)
        if user is not None and captcha_input.lower() == captcha_text.lower():
            login(request, user)
            return redirect('index')
        else:
            return redirect('login')
    else:
        captcha_text = generate_captcha()
        request.session['captcha_text'] = captcha_text
        return render(request, 'login.html', {'captcha_text': captcha_text})

示例一

假设我们有一个名为myapp的app,我们需要修改myapp中的views.py文件来生成验证码。

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from .models import Post
from .forms import PostForm
from PIL import Image, ImageDraw, ImageFont
import random, string

def generate_captcha():
    # 随机生成字符串
    captcha_text = ''.join(random.sample(string.ascii_letters + string.digits, 4))
    # 设置图片尺寸
    img_size = (100, 30)
    # 设置字体
    font = ImageFont.truetype("arial.ttf", 28)
    # 设置背景颜色
    bg_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
    # 设置字体颜色
    font_color = (255, 255, 255)
    # 创建画布
    img = Image.new(mode="RGB", size=img_size, color=bg_color)
    draw = ImageDraw.Draw(img)
    # 将验证码字符串写到画布上
    draw.text((10, 0), captcha_text, font=font, fill=font_color)
    # 噪点干扰
    for i in range(random.randint(120,130)):
        draw.point([random.randint(0,img_size[0]),random.randint(0,img_size[1])],fill=(0,0,0))
    # 画框
    draw.rectangle([1,1,img_size[0]-1,img_size[1]-1],outline=(255,255,255))
    # 将生成的验证码图片保存
    img.save('myapp/captcha.png', 'PNG')
    # 返回验证码字符串
    return captcha_text

def login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        captcha_input = request.POST['captcha_input']
        captcha_text = request.session.get('captcha_text')
        user = authenticate(request, username=username, password=password)
        if user is not None and captcha_input.lower() == captcha_text.lower():
            login(request, user)
            return redirect('index')
        else:
            return redirect('login')
    else:
        captcha_text = generate_captcha()
        request.session['captcha_text'] = captcha_text
        return render(request, 'login.html', {'captcha_text': captcha_text})

示例二

假设我们需要更改验证码图片的尺寸,可以修改generate_captcha()函数中的img_size变量。

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from .models import Post
from .forms import PostForm
from PIL import Image, ImageDraw, ImageFont
import random, string

def generate_captcha():
    # 随机生成字符串
    captcha_text = ''.join(random.sample(string.ascii_letters + string.digits, 4))
    # 设置图片尺寸 (200, 60)
    img_size = (200, 60)
    # 设置字体
    font = ImageFont.truetype("arial.ttf", 36)
    # 设置背景颜色
    bg_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
    # 设置字体颜色
    font_color = (255, 255, 255)
    # 创建画布
    img = Image.new(mode="RGB", size=img_size, color=bg_color)
    draw = ImageDraw.Draw(img)
    # 将验证码字符串写到画布上
    draw.text((10, 0), captcha_text, font=font, fill=font_color)
    # 噪点干扰
    for i in range(random.randint(200, 210)):
        draw.point([random.randint(0,img_size[0]),random.randint(0,img_size[1])],fill=(0,0,0))
    # 画框
    draw.rectangle([1,1,img_size[0]-1,img_size[1]-1],outline=(255,255,255))
    # 将生成的验证码图片保存
    img.save('myapp/captcha.png', 'PNG')
    # 返回验证码字符串
    return captcha_text

def login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        captcha_input = request.POST['captcha_input']
        captcha_text = request.session.get('captcha_text')
        user = authenticate(request, username=username, password=password)
        if user is not None and captcha_input.lower() == captcha_text.lower():
            login(request, user)
            return redirect('index')
        else:
            return redirect('login')
    else:
        captcha_text = generate_captcha()
        request.session['captcha_text'] = captcha_text
        return render(request, 'login.html', {'captcha_text': captcha_text})

这样我们就完成了Django中使用pillow实现登录验证码功能(带刷新验证码功能)的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django中使用pillow实现登录验证码功能(带刷新验证码功能) - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • 使用 Spring Boot Admin 监控应用状态的详细过程

    使用 Spring Boot Admin 监控应用状态可以轻松地查看应用的运行情况,包括各种监控指标、堆栈跟踪、日志等。下面是使用 Spring Boot Admin 监控应用状态的详细过程: 准备环境 在开始使用 Spring Boot Admin 之前,需要安装以下软件: JDK 1.8 或以上版本 Maven 或 Gradle 创建 Spring Bo…

    人工智能概览 2023年5月25日
    00
  • Mongodb批量删除gridfs文件实例

    下面是关于 “Mongodb批量删除gridfs文件实例” 的完整攻略: 1. 准备工作 在开始删除文件之前,我们需要确保已经安装了 MongoDB 数据库和支持 GridFS 的语言驱动程序(比如 Node.js 的 mongodb 库)。 2. 执行删除操作 接下来,我们需要在 MongoDB 数据库中执行删除操作。通常,我们可以用两种方法来删除 Gri…

    人工智能概论 2023年5月25日
    00
  • nginx配置SSL证书实现https服务的方法

    下面是关于Nginx配置SSL证书实现HTTPS服务的方法的完整攻略: 1. 生成SSL证书 首先需要生成SSL证书,可以通过以下命令生成: sudo apt-get update sudo apt-get install openssl sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -ke…

    人工智能概览 2023年5月25日
    00
  • Python中暂存上传图片的方法

    下面是详细讲解Python中暂存上传图片的方法的完整攻略。 1. 前提条件 在进行任何操作之前,需要确保你已经安装了Python并且熟悉了基本的Python语法和操作。 2. 为什么要暂存上传图片? 在进行图片上传过程中,有些情况下需要对图片进行暂存处理,比如:- 验证图片是否符合规定要求- 对图片进行压缩处理- 将图片拆分成多个部分进行上传 3. Pyth…

    人工智能概论 2023年5月25日
    00
  • 基于opencv+java实现简单图形识别程序

    基于OpenCV和Java实现简单图形识别程序的攻略分为以下几个步骤: 安装OpenCV 下载并安装OpenCV,在官网的下载页面(https://opencv.org/releases/)中选择适合自己操作系统的版本进行下载。 解压下载好的压缩包到本地。 将OpenCV添加到系统PATH环境变量中,在Windows操作系统中可在“环境变量”中设置。 配置J…

    人工智能概览 2023年5月25日
    00
  • 使用python写的opencv实时监测和解析二维码和条形码

    使用Python编写OpenCV实时监测和解析二维码和条形码的攻略: 安装必要的软件和库 为了能够使用Python编写OpenCV程序,需要先安装必要的软件和库。以下是需要安装的软件和库: Python3: 用于编写程序 OpenCV: 用于处理图像和视频 pyzbar: 用于解析二维码和条形码 可以使用以下命令来安装这些软件和库: pip install …

    人工智能概览 2023年5月25日
    00
  • JavaCV实现读取视频信息及自动截取封面图详解

    JavaCV实现读取视频信息及自动截取封面图详解 JavaCV是Java和OpenCV的一套接口,可以轻松地在Java环境下使用OpenCV库。本文将介绍如何使用JavaCV读取视频信息以及如何自动截取封面图。 基本环境 Java 8或以上版本 Maven JavaCV 读取视频信息 通过JavaCV可以实现读取视频信息,包括视频的宽度、高度、帧率以及时长等…

    人工智能概览 2023年5月25日
    00
  • python 生成唯一id的四种方式

    当我们需要生成唯一的ID时,Python提供了多种方法可以做到这一点。以下是四种常见的方法: 方法一:使用 uuid 模块 Python内置了uuid模块,可以用于生成唯一的ID。示例代码如下: import uuid print(uuid.uuid1()) # 根据时间戳生成UUID print(uuid.uuid3(uuid.NAMESPACE_DNS,…

    人工智能概论 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部