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日

相关文章

  • 利用nginx解决cookie跨域访问的方法

    下面是利用Nginx解决Cookie跨域访问的方法的完整攻略: 什么是Cookie跨域? 当一个网站向另一个域名的网站发送请求时,当前网站在请求中会携带Cookie信息。这种情况下,另一个域名的网站将无法获取Cookie信息,从而导致跨域问题。 使用Nginx解决Cookie跨域问题 Nginx是一款高性能的HTTP服务器和反向代理服务器,可以用来作为解决C…

    人工智能概览 2023年5月25日
    00
  • python3通过selenium爬虫获取到dj商品的实例代码

    下面我将详细讲解“python3通过selenium爬虫获取到dj商品的实例代码”的完整攻略步骤,包括一些常见问题和两条示例说明。 简介 Selenium 是一个自动化测试工具,利用它我们可以驱动浏览器执行特定的动作,模拟人为对浏览器的操作。通过 Python 的 selenium 库更可以方便地实现网页爬虫。在本文中,我将演示如何使用 Python3 和 …

    人工智能概论 2023年5月25日
    00
  • 消息队列 RabbitMQ 与 Spring 整合使用的实例代码

    下面我将详细讲解“消息队列 RabbitMQ 与 Spring 整合使用的实例代码”的完整攻略。 1. RabbitMQ 介绍 RabbitMQ 是一个流行的开源消息队列软件,它实现了 AMQP(高级消息队列协议),是一个可靠的、易于使用的面向消息的中间件。RabbitMQ 为应用程序提供了异步通信和系统解耦的架构,它使不同系统之间的通信变得更加简单和可靠,…

    人工智能概览 2023年5月25日
    00
  • Python如何读取相对路径文件

    下面我将针对Python如何读取相对路径文件给出详细讲解的攻略。 什么是相对路径? 在计算机文件系统中,相对路径是指从当前目录到目标文件或目录的路径。相对路径的最常见情况是从当前工作目录开始的。 例如,在Windows操作系统中,如果当前工作目录为D:/Projects,那么相对路径./data.txt将引用位于D:/Projects/data.txt的文件…

    人工智能概览 2023年5月25日
    00
  • 教你使用Python实现一个简易版Web服务器

    教你使用Python实现一个简易版Web服务器 在本篇攻略中,我们将使用Python编写一个基于TCP协议的简易版Web服务器,以便更好地理解网络编程和Web服务器工作原理。 什么是Web服务器? Web服务器是一种软件,它接收来自互联网的HTTP请求,并将HTTP响应发送回给请求者。Web服务器通常托管网站、应用程序或API,并与浏览器等客户端设备进行通信…

    人工智能概论 2023年5月25日
    00
  • Django多层嵌套ManyToMany字段ORM操作详解

    Django多层嵌套ManyToMany字段ORM操作详解 在Django中,我们可以使用ORM来定义模型之间的关系,其中ManyToMany字段是一种常见的关系类型,它可以实现多对多的关系。 当多个模型之间存在多层嵌套的ManyToMany字段时,我们需要注意如何进行操作。本文将详细讲解Django在多层嵌套ManyToMany字段上的ORM操作。 准备工…

    人工智能概论 2023年5月25日
    00
  • 流行的软件测试工具介绍

    流行的软件测试工具介绍 在软件开发和测试过程中,使用合适的测试工具可以提高测试效率和测试质量。以下是一些流行的软件测试工具的介绍及其使用场景和示例。 功能测试工具 1. Selenium Selenium 是一款功能测试工具,可以模拟用户在多种不同浏览器上操作网页,支持多种开发语言。例如,可以使用 Selenium 对网站进行自动化测试,验证网站是否符合用户…

    人工智能概论 2023年5月25日
    00
  • CentOS7 禁用Transparent Huge Pages的实现方法

    以下是“CentOS7禁用Transparent Huge Pages的实现方法”的完整攻略: 简介 在Linux系统中,内存管理是一个非常重要的组件。其中,为了优化内存的使用效率,Linux提供了一种称为“Transparent Huge Pages”的功能。但是,在某些情况下,这种功能会影响应用程序的性能表现。因此,禁用这种功能对于高性能应用程序来说是非…

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