【Django】【实用Demo】图形验证码Demo

环境说明:

  1. 系统:Windows10
  2. 开发工具:Pycharm
  3. Python版本:3.5


1. 创建Django基础工程

直接使用Pycharm创建,当然你也可能使用命令行方式来创建Django工程,如图正常在浏览器里面能运行起来说明工程创建成功


【Django】【实用Demo】图形验证码Demo

创建工程


【Django】【实用Demo】图形验证码Demo

运行测试


【Django】【实用Demo】图形验证码Demo

运行正常


2. 给虚拟环境安装django自带验证码插件包

  • 安装方法如下
<code># pip install django-simple-captcha (0.5.12)/<code>
  • 不过在Windows下可以直接使用Pycharm来安装


【Django】【实用Demo】图形验证码Demo


3. 核心代码

  • 添加验证码App,文件Demo/settings.py
<code>INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app.apps.AppConfig',
    'captcha'
]
# 需要屏蔽csrf,会影响post请求
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]/<code>
  • 添加路由,Demo\urls.py
<code>from django.conf.urls import url, include
from django.contrib import admin

from app.views import refresh_captcha, Check

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # Django验证码插件注册,不能删除
    url(r'^captcha', include('captcha.urls')),
    # 获取验证码或者刷新验证码接口
    url(r'^refresh_captcha$', refresh_captcha),
    # 校验验证码是否正确
    url(r'^check_captcha$', Check.as_view()),
]/<code>
  • 在app里面新建service.py,添加下面核心代码
<code>from captcha.helpers import captcha_image_url
from captcha.models import CaptchaStore
from django.utils import timezone


def captcha():
    """
    创建验证码
    :return:
    """
    hash_key = CaptchaStore.generate_key()  # 验证码答案
    image_url = captcha_image_url(hash_key)  # 验证码地址
    return {'hash_key': hash_key, 'image_url': image_url}


def check_captcha(captcha_str, captcha_hash_key):
    """
    验证验证码
    :param captcha_str:
    :param captcha_hash_key:
    :return:
    """
    if captcha_str and captcha_hash_key:
        try:
            # 获取根据hashkey获取数据库中的response值
            get_captcha = CaptchaStore.objects.get(hashkey=captcha_hash_key)
            if get_captcha.response == captcha_str.lower():  # 如果验证码匹配
                if get_captcha.expiration > timezone.now():
                    return True, "验证成功"
                else:
                    return False, "验证码过期"
        except:
            return False, "验证码错误"

    return False, "验证码错误"
/<code>
  • 添加视图,app\views.py
<code>import json
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render

# Create your views here.
from django.views import View

from app.service import captcha, check_captcha


def refresh_captcha(request):
    """
    刷新验证码、获取验证码
    :param request:
    :return:
    """
    results = {'status': 0, 'msg': '获取成功', 'data': captcha()}
    return HttpResponse(json.dumps(results), content_type='application/json')


class Check(View):
    """验证码校验"""

    def post(self, request):
        results = {'status': 1, 'msg': '校验失败'}
        try:
            data = json.loads(request.body.decode())
            captcha = data['captcha']
            hash_key = data['hash_key']
            status, msg = check_captcha(captcha, hash_key)
            results = {'status': 0 if status else 1, 'msg': msg}
        except Exception as error:
            print(error)

        return JsonResponse(results)
/<code>


4. 测试效果

  • 使用postman获取验证码


【Django】【实用Demo】图形验证码Demo


  • 查看图形验证码


【Django】【实用Demo】图形验证码Demo


  • 验证码校验,验证码提示:验证码成功、验证码错误、验证码过期


【Django】【实用Demo】图形验证码Demo


5. 其他配置

[官网文档地址] https://django-simple-captcha.readthedocs.io/en/latest/

具体细节阅读官网文档内容,模式有好几种:普通验证码校验、单词模式、计算模式等

<code>
# Django图形验证码配置
# 字母验证码
# 设置 captcha 图片大小
CAPTCHA_IMAGE_SIZE = (150, 45)
# 字体大小
CAPTCHA_FONT_SIZE = 36
# 字符个数
CAPTCHA_LENGTH = 4
# 超时(minutes)
CAPTCHA_TIMEOUT = 10
# 验证码的背景颜色
CAPTCHA_BACKGROUND_COLOR = '#ffffff'
# 字体路径
CAPTCHA_FONT_PATH = './conf/Phosphate-Inline.ttf'
# 加减乘除验证码
# CAPTCHA_OUTPUT_FORMAT = '%(image)s %(text_field)s %(hidden_field)s '
# CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_null',
#                            'captcha.helpers.noise_arcs',  # 线
#                            'captcha.helpers.noise_dots',  # 点
#                            )
# CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.math_challenge'/<code> 



分享到:


相關文章: