django-simple-captcha 图形码验证,captcha点击不能刷新的问题解决

文章探讨了在Django项目中集成captcha并处理图形验证码不刷新的问题,包括配置设置、安装步骤和前端HTML代码的调整。
摘要由CSDN通过智能技术生成

学习django框架,遇到captcha图形验证码不刷新问题,参考了大神:Django中图形验证码(django-simple-captcha)-CSDN博客 的博文终于解决问题。

如下:

1.setting配置: 安装”captcha“和captcha配置

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'App.apps.AppConfig',
    'App01.apps.App01Config',
    # 安装应用
    'captcha',
]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'pyth3',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}
# 图形码验证
# 如果CAPTCHA_FONT_PATH 参数属性设置后,图像验证图片不显示,必须注释掉
# CAPTCHA_FONT_PATH = 'fonts/Vera.ttf'        #用于呈现文本的字体文件的完整路径,文件可以是.TTF、.OTF格式。默认是fonts/Vera.ttf
CAPTCHA_FONT_SIZE = 24         #字体的像素大小,默认为22
CAPTCHA_IMAGE_SIZE = (100,25)         #以生成的验证码像素为单位的图像大小,指定为元组(宽度,高度)。默认为None
CAPTCHA_LITTER_ROTATION = (-15,15)         #在此区间内的随机旋转文本中的字符。默认为(-35, 35)
CAPTCHA_BACKGROUND_COLOR = 'red'         #验证码背景颜色,可以表示为html风格的#rrggbb, rgb(red,green,blue),又或者常见的html名字,例如red。默认为#ffffff
CAPTCHA_FOREGROUND_COLOR = '#ffffff'         #验证码前景色,默认为#001100
CAPTCHA_MATH_CHALLENGE_OPERATOR = 'x'         #在使用math_challenge时,允许您选择乘法运算符。例如采用"x"代替。默认为*
CAPTCHA_WORDS_DICTIONARY = None         #包含单词列表的文件目录。只有当CAPTCHA_CHALLENGE_FUNCT设置为captcha.helpers.word_challenge或captcha.helpers.huge_words_and_punctuation_challenge时需要。默认为/usr/share/dict/words
CAPTCHA_FLITE_PATH = None         #音频读取器所在目录。定义时,将自动读取验证码。默认为None
CAPTCHA_TIMEOUT = 1         #验证码的有效期,单位为分钟。默认为5
CAPTCHA_LENGTH = 4         #用于设置生成的验证码的长度,只有当CAPTCHA_CHALLENGE_FUNCT设置为captcha.helpers.random_char_challenge时需要。默认为4
CAPTCHA_DICTIONARY_MIN_LENGTH = 0         #控制从CAPTCHA_WORDS_DICTIONARY目录中随机抽取的单词的最小长度,只有当设置为captcha.helpers.word_challenge或captcha.helpers.huge_words_and_punctuation_challenge时需要。默认为0
CAPTCHA_DICTIONARY_MAX_LENGTH = 99         #控制从CAPTCHA_WORDS_DICTIONARY目录中随机抽取的单词的最大长度,只有当设置为captcha.helpers.word_challenge或captcha.helpers.huge_words_and_punctuation_challenge时需要。默认为99
CAPTCHA_TEST_MODE = False         #当设置为True时,字符串PASSED在任何情况下将被接受为对任何验证码的有效响应。用于测试目的。默认为False
# 设置输出的格式,该插件自动在模板中生成3个元素:一个验证码图片,一个验证码输入框、一个用于存放秘钥的隐藏输入框。可以在此根据需要调整其在模板中生成的先后顺序
CAPTCHA_OUTPUT_FORMAT = '%(text_field)s %(image)s %(hidden_field)s '
#图像过滤器。可调用对象的字符串列表,以PIL Image对象作为参数输入,修改并返回它。
CAPTCHA_NOISE_FUNCTIONS = (
    # 'captcha.helpers.noise_null',  # 没有样式
    # 'captcha.helpers.noise_arcs',  # 线
    'captcha.helpers.noise_dots',  # 点
)
# 图片中的文字为随机英文字母,如 mdsh 用于显示验证码内容与结果的可调用对象。如 2 + 2 =  'captcha.helpers.math_challenge'
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge'
# 验证码输入框指定 TEMPLATE, 表单使用 CaptchaField 字段生效
# CAPTCHA_TEXT_FIELD_TEMPLATE = "captcha_text_field.html"

# 自定义验证码
def generate_custom_challenge():
    length = 6  # 验证码长度
    characters = string.ascii_letters + string.digits  # 包含字母和数字的字符集
    captcha = ''.join(random.choice(characters) for _ in range(length))  # 生成随机验证码
    question = captcha  # 验证码的显示文本

 2. 项目路由的配置

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app/',include('App.urls')),
    path('captcha/',include('captcha.urls')),
    path('app01/',include('App01.urls')),
]

3. 应用App路由配置

urlpatterns = [
    # path('',views.index,name='index'),
    # 图形验证码
    path('captcha/',views.user_login,name='captcha'),
    path('refresh_captcha/',views.refresh_captcha),
]

4. views 代码

from captcha.helpers import captcha_image_url
from captcha.models import CaptchaStore

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


def refresh_captcha(request):
    return HttpResponse(json.dumps(captcha()),content_type='application/json')

5. html 代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/1.12.3/jquery.min.js"></script>
</head>
<body>
<form action="{% url 'App01:captcha' %}" method="post">
    {% csrf_token %}
    用户名:<input type="text" name="username"><br>
    密&nbsp&nbsp&nbsp码:<input type="password" name="password">{{ msg }}<br>
    验证码:{{ form.captcha }}<br>
    <input type="submit" value="提交">
</form>
<script>
    // 验证码图片点击刷新
    $(function(){
        $('.captcha').css({'cursor':'pointer'});
        // ajax刷新
        $('.captcha').click(function () {
            console.log('click');
            $.get("/app01/refresh_captcha/",
               function (result) {
                 $('.captcha').attr('src',result['image_url']);
                 $('#id_captcha_0').val(result['key'])
            });
        });
    })
</script>
</body>
</html>

点击验证码图片,可以刷新验证码。问题解决! 

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值