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

yizhihongxing

以下是详细讲解“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日

相关文章

  • pytorch 实现模型不同层设置不同的学习率方式

    要实现模型不同层设置不同学习率的方式,我们需要了解 PyTorch 中的参数组(Parameter Group)和优化器(Optimizer)两个概念。 PyTorch 中的参数组是一组参数,用于进行不同的学习率设置。而优化器则是一个用于执行梯度下降,更新模型参数的工具。PyTorch 中提供了多种优化器,包括 SGD、Adam、Adagrad 等。下面就是…

    人工智能概论 2023年5月25日
    00
  • 基于javascript处理nginx请求过程详解

    基于JavaScript处理Nginx请求过程详解 本篇攻略旨在介绍使用JavaScript与Nginx一同处理web请求的过程。首先需要了解Nginx的基本架构,它是由主进程(Master Process)和多个工作进程(Worker Process)组成的,其中主进程用于监听端口和管理工作进程,而工作进程用于处理来自客户端的请求。我们将基于这个架构使用J…

    人工智能概览 2023年5月25日
    00
  • 在Linux系统下使用Docker以及Weave搭建Nginx反向代理

    以下是在Linux系统下使用Docker以及Weave搭建Nginx反向代理的完整攻略: 准备工作 安装Docker和Weave 创建一个Docker网络用于Weave服务 在宿主机上安装Nginx 步骤一:启动Weave网络服务 Weave是一个高性能的虚拟网络,可以帮助我们在不同的Docker容器之间建立一个连接,从而实现容器之间的通讯。在这里,我们使用…

    人工智能概览 2023年5月25日
    00
  • Windows环境下配置Qt 5.8+opencv 3.1.0开发环境的方法

    下面是详细的“Windows环境下配置Qt 5.8+opencv 3.1.0开发环境的方法”的攻略: 环境要求 Windows操作系统 Qt5.8+(建议使用官方安装包,如qt-opensource-windows-x86-5.8.0.exe) opencv3.1.0+ (建议使用官方安装包,如opencv-3.1.0.exe) 步骤 1. 安装Qt5 安装…

    人工智能概览 2023年5月25日
    00
  • Python的Django框架中的Context使用

    下面是Python的Django框架中的Context使用的完整攻略: 什么是Context? Context是Django框架中一个非常重要的部分,它负责传递模板中需要的变量以及函数等信息。在Django框架中,Context通常是一个字典对象,其中键为变量名,值为对应变量的值。 如何定义Context? 在Django框架中,可以通过定义一个字典来创建C…

    人工智能概览 2023年5月25日
    00
  • python使用urlparse分析网址中域名的方法

    下面是详细的“Python使用urlparse分析网址中域名的方法”的攻略,包括: 一、什么是urlparse? urlparse是Python中一个用于解析URL地址的库,可以将URL地址解析成6个部分:协议、域名、路径、参数、查询参数和锚点。其中,我们可以通过urlparse获取其中的域名信息,常见用法如下: from urllib.parse impo…

    人工智能概览 2023年5月25日
    00
  • PHP调用Webservice实例代码

    下面是关于“PHP调用Webservice实例代码”的完整攻略。 什么是Webservice? WebService是一种通过网络使用web通信协议进行交互的技术。使用WebService技术能够在不同的操作系统和应用之间进行数据交换,使得互操作性更好。 PHP调用Webservice的实现方式 PHP调用Webservice可以使用SOAP(基于XML的协…

    人工智能概论 2023年5月25日
    00
  • 关于Keras模型可视化教程及关键问题的解决

    关于Keras模型可视化教程及关键问题的解决 Keras是一个用于构建神经网络的高级API,它是一个由Python编写的开源神经网络库。Keras的使用得到了广泛的认可,因为它既可以作为Tensorflow、MXNet等深度学习框架的前端,又可以使用Theano作为后端,具有强大的GPU加速能力。 在实践中,我们通常需要在Keras中构建比较复杂的模型,对于…

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