使用Django实现商城验证码模块的方法
- 安装需要的包
安装需要的Python包:captcha、Pillow
pip install captcha Pillow
安装验证码字体文件可以提高生成验证码的难度,这里我们使用DejaVuSans.ttf字体作为验证码字体。
sudo apt-get install fonts-dejavu-core
- 在settings.py中添加App和配置
在INSTALLED_APPS
中保证captcha
应用被添加
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'captcha', # 添加
]
# Captcha Settings
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge'
CAPTCHA_LENGTH = 6 # 验证码长度
CAPTCHA_IMAGE_FONT = 'DejaVuSans.ttf' # 字体
CAPTCHA_IMAGE_SIZE = (100, 30) # 图片大小
CAPTCHA_BACKGROUND_COLOR = '#ffffff' # 背景颜色
CAPTCHA_FOREGROUND_COLOR = '#000000' # 前景颜色
CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_arcs',)# 噪音干扰
CAPTCHA_TEXT_FIELD_TEMPLATE = 'captcha_field.html' # 自定义验证码表单<input>模板
CAPTCHA_OUTPUT_FORMAT = u'%(text_field)s %(image)s %(hidden_field)s' # 验证码模板
- 在视图函数使用
在业务视图函数中设置验证码
from captcha.models import CaptchaStore
from captcha.helpers import captcha_image_url
def auth(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
captcha = request.POST.get('captcha', '')
# 验证验证码是否正确
cs = CaptchaStore.objects.filter(response=captcha, hashkey=request.POST.get('hashkey'))
if not cs:
return render(request, 'error.html', {'message': '验证码错误'})
else:
CaptchaStore.remove_expired()
# 登陆验证逻辑省略...
else:
hashkey = CaptchaStore.generate_key() # 生成hashkey
img_url = captcha_image_url(hashkey) # 获取验证码图片url
context = {
'hashkey': hashkey,
'img_url': img_url,
}
return render(request, 'auth.html', context)
- 设置表单验证码
可以在使用自定义表单时加入验证码验证逻辑:
<form action="{% url 'auth' %}" method="post">
{% csrf_token %}
{{ form.username }}
{{ form.password }}
{{ form.captcha }} <!-- 自定义模板 {% include "captcha_field.html" %} --->
<img src="{{ img_url }}" alt="captcha" onclick="this.src='{{ img_url }}?'+Math.random();">
<button type="submit">Login</button>
</form>
在此之后,用户可以在表单中输入验证码,并通过CaptchaStore中的方法进行验证。
示例1:
# 在视图函数中生成hashkey和验证码图片
def my_view(request):
hashkey = CaptchaStore.generate_key()
img_url = captcha_image_url(hashkey)
# ...
# 在模板中显示图片及验证码输入框
<img src="{{ img_url }}" />
<input type="text" name="captcha" />
示例2:
# 在视图函数中验证用户提交的验证码是否正确
def my_view(request):
captcha = request.POST.get('captcha')
hashkey = request.POST.get('hashkey')
cs = CaptchaStore.objects.filter(response=captcha, hashkey=hashkey)
if not cs:
# 验证码错误逻辑
# ...
else:
# 验证码正确逻辑
# ...
以上是通过Django实现商城验证码模块的方法,该方法可以加强站点的安全性,防止恶意攻击和机器人行为。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用Django实现商城验证码模块的方法 - Python技术站