django项目登录中使用图片验证码的实现方法

下面是关于“Django项目登录中使用图片验证码的实现方法”的完整攻略,包含以下几个步骤:

步骤一:安装必要的Python库

使用图片验证码需要安装Pillow库,可以使用pip来安装,命令如下:

pip install pillow

步骤二:生成随机验证码

我们可以使用Python的Pillow库来生成一张随机的图片验证码:

import random
from PIL import Image, ImageDraw, ImageFont

def generate_random_code(length=4):
    # 生成指定长度的随机验证码
    return ''.join(random.sample('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', length))

def generate_code_image(code, width=120, height=50):
    # 生成指定大小的验证码图片
    font_path = 'path/to/your/image/font.ttf'  # 需要提供一个字体文件路径
    font = ImageFont.truetype(font_path, size=36)
    image = Image.new('RGB', (width, height), (255, 255, 255))
    draw = ImageDraw.Draw(image)
    for x in range(width):
        for y in range(height):
            draw.point((x, y), fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
    for i in range(len(code)):
        draw.text((20 * i + 10, 10), code[i], font=font, fill=(255, 0, 0))
    return image

步骤三:将验证码图片显示在登录页面

我们可以在登录页面中加入一个<img>标签来显示验证码图片,同时将随机生成的验证码放入session中,以便在提交表单的时候校验验证码是否正确。

<form method="post">
  {% csrf_token %}
  <input type="text" name="username">
  <input type="password" name="password">
  <input type="text" name="code">
  <img src="/captcha/" alt="验证码">
  <input type="submit" value="登录">
</form>

其中,/captcha/是一个Django视图函数的URL,将会匹配到下面的视图函数。

步骤四:编写Django视图函数

import io
from django.shortcuts import render, HttpResponse
from .utils import generate_random_code, generate_code_image

def captcha(request):
    # 生成随机验证码
    code = generate_random_code(length=4)
    # 生成验证码图片字节流
    img = generate_code_image(code)
    buffer = io.BytesIO()
    img.save(buffer, format='jpeg')
    # 将验证码存入session中
    request.session['captcha'] = code
    # 返回验证码图片给浏览器
    return HttpResponse(buffer.getvalue(), content_type='image/jpeg')

上面的代码中,generate_random_codegenerate_code_image是之前生成随机验证码和验证码图片的函数,captcha是一个Django视图函数,用于返回生成的验证码图片,同时将验证码保存到session中。

提交登录表单时,需要校验输入的验证码是否正确。可以在登录视图函数中加入如下代码:

def login(request):
    if request.method == 'POST':
        # 先校验验证码
        code = request.POST.get('code')
        if code != request.session.get('captcha'):
            return HttpResponse('验证码错误!')
        # 处理登录请求
        ...
    else:
        return render(request, 'login.html')

上面的代码中,request.POST.get('code')获取用户输入的验证码,request.session.get('captcha')获取之前存储的验证码,如果两者不一致则返回错误信息。

示例说明一:在Django Admin中添加图片验证码

我们可以在django.contrib.admin模块中注册一个自定义的登录视图,来实现在Django Admin中添加图片验证码的功能:

from django.contrib.admin import site, AdminSite
from django.contrib.auth.views import LoginView
from django.urls import path
from django.utils.decorators import method_decorator
from django.views.decorators.cache import never_cache
from .utils import generate_random_code, generate_code_image

class CaptchaAdminSite(AdminSite):
    login_template = 'admin/login_with_captcha.html'

    @never_cache
    def login(self, request, extra_context=None):
        code = generate_random_code(length=4)
        img = generate_code_image(code)
        buffer = io.BytesIO()
        img.save(buffer, format='jpeg')
        request.session['captcha'] = code
        response = HttpResponse(buffer.getvalue(), content_type='image/jpeg')
        response['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0'
        response['Pragma'] = 'no-cache'
        return response

    @method_decorator(never_cache)
    def index(self, request, extra_context=None):
        return super().index(request, extra_context=extra_context)

captcha_admin_site = CaptchaAdminSite(name='captchadmin')

上面的代码中,CaptchaAdminSite是一个自定义的AdminSite,我们重写了其login方法,在其中生成验证码图片,保存到session中,然后返回验证码图片。

同时,我们还需要创建一个修改后的Django Admin的登录模板admin/login_with_captcha.html,以便在其中引入验证码图片:

{% extends "admin/login.html" %}

{% block head %}
  {{ block.super }}
  <style>
    #captcha {
      cursor: pointer;
    }
  </style>
{% endblock %}

{% block body %}
  <h1>{% trans 'Log in' %}</h1>
  <form method="post" action="{% url 'admin:login' %}">
    {% csrf_token %}
    {% if form.non_field_errors %}
      <div class="alert alert-danger">{{ form.non_field_errors }}</div>
    {% endif %}
    <div class="form-group{% if form.username.errors %} has-danger{% endif %}">
      {{ form.username.label_tag }}
      {{ form.username }}
      {% if form.username.errors %}
        <div class="form-control-feedback">{{ form.username.errors }}</div>
      {% endif %}
    </div>
    <div class="form-group{% if form.password.errors %} has-danger{% endif %}">
      {{ form.password.label_tag }}
      {{ form.password }}
      {% if form.password.errors %}
        <div class="form-control-feedback">{{ form.password.errors }}</div>
      {% endif %}
    </div>
    <div class="form-group">
      {{ form.captcha.label_tag }}
      {{ form.captcha }}
    </div>
    <hr>
    <input type="submit" class="btn btn-primary" value="{% trans 'Log in' %}">
  </form>
  <p id="captcha">{{ _('Click to Refresh') }}</p>
{% endblock %}

{% block extrajs %}
  {{ block.super }}
  <script>
    $('#captcha').on('click', function() {
      $('img.captcha').attr('src', '/admin/login/captcha/?_=' + Math.random());
    });
  </script>
{% endblock %}

在模板中我们添加了一个<img>标签,用于显示验证码图片,同时也添加了一个点击事件,使得在点击验证码图片时可以通过AJAX重新加载新的验证码。

上面的代码中,{% if form.captcha.errors %} has-danger{% endif %}{{ form.captcha }}用于在表单中添加验证码输入框,同时校验验证码是否正确。

最后,我们需要将修改后的Django Admin的URL映射到之前定义的CaptchaAdminSite上:

from django.contrib.admin import site
from .admin import captcha_admin_site

site = captcha_admin_site

示例说明二:使用django-simple-captcha库

django-simple-captcha是一个Django的一个第三方库,提供了方便易用的图片验证码功能,我们可以使用这个库来快速实现图片验证码。

首先,需要安装django-simple-captcha库:

pip install django-simple-captcha

然后在Django项目中添加captcha应用,并在INSTALLED_APPS中添加captcha应用:

INSTALLED_APPS = [
    # ...
    'captcha',
    # ...
]

接下来,需要在urls.py中添加如下URL映射:

from captcha.views import captcha_refresh

urlpatterns = [
    # ...
    path('captcha/', captcha_refresh, name='captcha'),
    # ...
]

最后,我们需要在登录视图函数中添加django-simple-captcha所提供的验证码校验功能:

from captcha.fields import CaptchaField
from captcha.helpers import captcha_image_url

class LoginForm(forms.Form):
    username = forms.CharField(max_length=30)
    password = forms.CharField(widget=forms.PasswordInput)
    captcha = CaptchaField()

def login(request):
    form = LoginForm(request.POST or None)
    if form.is_valid():
        # 处理登录请求
        ...
    return render(request, 'login.html', {'form': form})

上面的代码中,我们使用了django-simple-captcha所提供的CaptchaField字段,用于在表单中添加图片验证码输入框。同时,在模板中使用{% captcha_image %}标签,以便在浏览器中显示验证码图片。

至此,我们已经完成了图片验证码的实现方法说明,可以根据以上步骤加入图片验证码功能到自己的Django项目中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django项目登录中使用图片验证码的实现方法 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • pycharm部署django项目到云服务器的详细流程

    下面是“pycharm部署django项目到云服务器的详细流程”的完整攻略: 准备工作 云服务器:你需要一个云服务器,具体可以选择阿里云、腾讯云等云服务商。并且在云服务器上开启相应的端口,例如80端口,用于访问网页。 pycharm:推荐使用最新版的pycharm实现部署。 django项目:已经开发完成的django项目,并且可以在本地没有问题地运行。 部…

    python 2023年5月13日
    00
  • Python float函数实例用法

    Python float函数实例用法 Python中的float()函数用于将其他数据类型转换为浮点数类型。在实际的数据处理中,浮点数类型通常用于表示非整数的数量或者量度指标。 基本语法 float([x]) 其中,x表示要转换成浮点数的值。如果不提供任何参数,则返回0.0。 示例说明 示例1:基本用法 x = 6 y = 4 result = float(…

    python 2023年5月18日
    00
  • python处理列表的部分元素的实例详解

    来讲解一下 “python处理列表的部分元素的实例详解” 吧。 标题 我们首先需要添加一个一级标题来简述我们要讲解的内容,如下: Python处理列表的部分元素的实例详解 介绍 在Python中,列表是一种非常常见的数据类型,我们经常需要对列表进行操作来满足不同的需求。其中,处理列表的部分元素,是我们操作中非常重要的一个环节。比如说,我们可能需要取出一个列表…

    python 2023年5月14日
    00
  • Python的历史与优缺点整理

    Python的历史 Python是由Guido van Rossum于1989年在荷兰创建的,它是一种解释型、交互式、面向对象的高级程序设计语言。Python的发展历程中经历了以下几个阶段: Python 1.x:1991-1999年,是Python的初始版本,包含了基本的语法、面向对象、异常处理等特性。 Python 2.x:2000-2010年,是Pyt…

    python 2023年5月13日
    00
  • 详解python路径拼接os.path.join()函数的用法

    当进行文件 or 文件夹拼接操作时,Python提供了os.path.join()函数。本文将详解os.path.join()函数并提供代码示例。 一、os.path.join()函数的用法 在Python操作文件时,经常需要处理文件路径合并问题。使用Python内置库os.path可以方便的处理平台间的差异,使用其中的os.path.join()函数可以实…

    python 2023年6月2日
    00
  • python中scikit-learn机器代码实例

    针对“python中scikit-learn机器代码实例”,我整理了以下完整攻略: Scikit-learn简介 Scikit-learn是一个用于机器学习的Python库,它基于NumPy、SciPy和matplotlib等科学计算工具,提供了各种机器学习算法的实现,包括分类、回归、聚类、降维等。它的特点是简单易用、功能齐全、高效稳定、开源免费,是Pyth…

    python 2023年5月23日
    00
  • Python正则表达中re模块的使用

    Python正则表达式中re模块的使用 在Python中,re模块是一个强大的正则表达式处理工具,可以用于字符串匹配、替换、分割等操作。本攻略将详细讲解Python正则表达式中re模块的使用,包括如何使用re模块实现常见的文本处理需求。 re模块的基本用法 在Python中,我们可以使用re模块来处理正则表达式。re模块提供了一系列函数,用于处理正则表达式。…

    python 2023年5月14日
    00
  • python 对象和json互相转换方法

    Python 对象和 JSON 互相转换是编程中经常遇到的问题,本文将介绍 Python 中将对象转换为 JSON,以及将 JSON 转换为 Python 对象的方法。 Python 对象转换为 JSON 使用 Python 内置的 json 模块,可以将 Python 对象转换为 JSON 格式的字符串。 下面是将 Python 字典对象转换为 JSON …

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部