【Django】django-simple-captcha 验证码配置

发布时间 2023-08-30 16:46:25作者: 是阿杰呀

1. django-simple-captcha 下载

pip install django-simple-captcha

2. 配置

2.1 settings.py 配置
# 注册 app
INSTALLED_APPS = [
    ....
    'captcha',  # 图形验证码
]

# 导入 库
import string
import random

# 自定义验证码
def generate_custom_challenge():
    length = 6  # 验证码长度
    characters = string.ascii_letters + string.digits  # 包含字母和数字的字符集
    captcha = ''.join(random.choice(characters) for _ in range(length))  # 生成随机验证码
    question = captcha  # 验证码的显示文本
    return question, captcha
	
# 配置 captcha
# CAPTCHA_LENGTH = 4  # 设置验证码位数 默认: 4
CAPTCHA_TIMEOUT = 5  # 超时(minute)
CAPTCHA_FONT_SIZE = 24  # 字体大小 默认:22
# CAPTCHA_IMAGE_SIZE = (130, 45)  # 设置 图片大小 默认: (200, 60)
CAPTCHA_CHALLENGE_FUNCT = generate_custom_challenge  # 验证码字符集, 自定义
# CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.math_challenge'  # 验证码字符集
# CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge'  # 验证码字符集
2.2 总 urls.py 配置
from django.urls import include

urlpatterns = [
    # 图片验证码
    path('captcha/', include('captcha.urls')),
]
2.3 views.py 配置
from captcha.helpers import captcha_image_url
from captcha.models import CaptchaStore

# 生成图片验证码
class GenerateCaptcha(APIView):
    authentication_classes = []  # 免认证
    permission_classes = []

    def get(self, request):
        captcha_key = CaptchaStore.generate_key()
        image_url = captcha_image_url(captcha_key)
        res = {
            'key': captcha_key,
            'image_url': image_url
        }
        return JsonResponse(res)

# 验证图片验证码
class VerifyCaptcha(APIView):
    def post(self, request):
        print(request.POST)
        captcha_key = request.POST.get('captcha_key')
        captcha_value = request.POST.get('captcha_value')

        CaptchaStore.remove_expired()  # 清除过期验证码

        try:
            captcha = CaptchaStore.objects.get(challenge=captcha_value, hashkey=captcha_key)
            captcha.delete()  # 删除
            valid = True
        except CaptchaStore.DoesNotExist:
            valid = False
        except:
            valid = 'xxxx'

        res = valid
        return JsonResponse(res)