一般登录界面都会有图形验证码,我们可以使用第三方的模块captcha快速生成图形验证码返回给前端,并且把正确的文本保存到Redis数据库
1.captcha
首先下载captcha,我已经上传到百度网盘,大家可以下载captcha使用,提取码: mxum
下载完之后进行解压,得到一个captcha文件,我们把它复制到项目文件夹里
该模块使用很简单,只需要导入captcha.py文件,再调用generate_captcha()方法即可生成一张jpg格式的四位数验证码图片
from XXXXXX.captcha.captcha import captcha
text, image = captcha.generate_captcha()
2.配置Redis数据库
在配置文件的 CACHES 字典里添加Redis数据库的存储信息,我们把验证码文本存储到2号库,该库别名是verify_code,后面取数据会用这个别名
CACHES = {
...
# 验证码信息: 存到 2 号库
"verify_code": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/2",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
}
3.存储到Redis并设置有效期
我们把生成的验证码文本存到Redis数据库,把图片返回给前端,前端要在一定时间内请求对比验证码,否则失效
verification.views.py
from django.views import View
from django import http
from django_redis import get_redis_connection
from XXXXXX.captcha.captcha import captcha
class ImageCodeView(View):
def get(self, request, uuid):
# 生成图形验证码
text, image = captcha.generate_captcha()
# 使用配置的redis数据库的别名,创建连接到redis的对象
redis_conn = get_redis_connection('verify_code')
# redis_conn.setex('key', '过期时间', 'value')
redis_conn.setex('img_%s' % uuid, 300, text) # 有效时间是300秒
# 响应图形验证码: image/jpg
return http.HttpResponse(image, content_type='image/jpg')
设置总路由和子路由
meiduo_mall.urls.py
urlpatterns = [
...
path(r'', include('apps.verifications.urls')),
]
verification.urls.py
urlpatterns = [
...
path('image_codes/<uuid:uuid>/', views.ImageCodeView.as_view()),
]