学习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>
密   码:<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>
点击验证码图片,可以刷新验证码。问题解决!