【Django】使用captcha生成图形验证码、设置有效期

深藏阁楼爱情的钟 2022-12-04 01:14 399阅读 0赞

一般登录界面都会有图形验证码,我们可以使用第三方的模块captcha快速生成图形验证码返回给前端,并且把正确的文本保存到Redis数据库

1.captcha

首先下载captcha,我已经上传到百度网盘,大家可以下载captcha使用,提取码: mxum
下载完之后进行解压,得到一个captcha文件,我们把它复制到项目文件夹里

该模块使用很简单,只需要导入captcha.py文件,再调用generate_captcha()方法即可生成一张jpg格式的四位数验证码图片

  1. from XXXXXX.captcha.captcha import captcha
  2. text, image = captcha.generate_captcha()

2.配置Redis数据库

在配置文件的 CACHES 字典里添加Redis数据库的存储信息,我们把验证码文本存储到2号库,该库别名是verify_code,后面取数据会用这个别名

  1. CACHES = {
  2. ...
  3. # 验证码信息: 存到 2 号库
  4. "verify_code": {
  5. "BACKEND": "django_redis.cache.RedisCache",
  6. "LOCATION": "redis://127.0.0.1:6379/2",
  7. "OPTIONS": {
  8. "CLIENT_CLASS": "django_redis.client.DefaultClient",
  9. }
  10. },
  11. }

3.存储到Redis并设置有效期

我们把生成的验证码文本存到Redis数据库,把图片返回给前端,前端要在一定时间内请求对比验证码,否则失效

verification.views.py

  1. from django.views import View
  2. from django import http
  3. from django_redis import get_redis_connection
  4. from XXXXXX.captcha.captcha import captcha
  5. class ImageCodeView(View):
  6. def get(self, request, uuid):
  7. # 生成图形验证码
  8. text, image = captcha.generate_captcha()
  9. # 使用配置的redis数据库的别名,创建连接到redis的对象
  10. redis_conn = get_redis_connection('verify_code')
  11. # redis_conn.setex('key', '过期时间', 'value')
  12. redis_conn.setex('img_%s' % uuid, 300, text) # 有效时间是300秒
  13. # 响应图形验证码: image/jpg
  14. return http.HttpResponse(image, content_type='image/jpg')

设置总路由和子路由

meiduo_mall.urls.py

  1. urlpatterns = [
  2. ...
  3. path(r'', include('apps.verifications.urls')),
  4. ]

verification.urls.py

  1. urlpatterns = [
  2. ...
  3. path('image_codes/<uuid:uuid>/', views.ImageCodeView.as_view()),
  4. ]

发表评论

表情:
评论列表 (有 0 条评论,399人围观)

还没有评论,来说两句吧...

相关阅读