一、准备
1、在Django工程的apps中,新建子应用verifications ,里面新建包libs,存放生成图片验证码的扩展包captcha
2、安装Pillow的图片库
添加captcha完成后,如果直接使用会报错:
报错原因:captcha 框架, 需要依赖 Pillow 这个包
在虚拟环境–安装 Python 处理图片的库 Pillow:
pip install Pillow -i https://pypi.tuna.tsinghua.edu.cn/simple
captcha 这个框架中有一个generate_captcha( )
函数, 调用这个函数, 可以同时生成一个图片和对应内容的文字信息(验证码):
- 使用示例:
# text 文本验证码
# image 验证码图片二进制流
text, image = captcha.generate_captcha()
print('验证码的内容是:', text)
# 将验证码图片二进制流 存入图片
with open('demo.png', 'wb') as f:
f.write(image)
3、图片验证码有时效性-选用redis数据库存储
在Django的配置文件中配置 Redis 的 2号库——存储图片验证码数据
# 验证码信息: 存到 2 号库
"verify_code": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/2",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
二、接口实现
逻辑分析:
1、请求方式
选项 | 方案 |
---|---|
请求方法 | get |
请求地址 | image_codes/(?P[\w-]+)/ |
2、请求参数:路径参数
参数名 | 类型 | 是否必传 | 说明 |
---|---|---|---|
uuid | string | 是 | 唯一编号 |
3、响应结果: image / jpg
知识点:
redis_conn.setex('key', '过期时间', 'value')
接口视图代码实现:
from django.views import View
from django import http
from django_redis import get_redis_connection
from apps.verifications.libs.captcha.captcha import captcha
class ImageCodeView(View):
"""图形验证码
GET http://www.meiduo.site:8000/image_codes/550e8400-e29b-41d4-a716-446655440000/
"""
def get(self, request, uuid):
"""
实现图形验证码逻辑
:param uuid: UUID
:return: image/jpg
"""
# 生成图形验证码
# text:验证码; image:验证码的图形(字节数据)
text, image = captcha.generate_captcha()
# 保存图形验证码
# 使用配置的redis数据库的别名,创建连接到redis的对象
redis_conn = get_redis_connection('verify_code')
# 使用连接到redis的对象去操作数据存储到redis
# redis_conn.set('key', 'value') # 因为没有有效期
# 图形验证码必须要有有效期的:美多商城的设计是300秒有效期
# redis_conn.setex('key', '过期时间', 'value')
redis_conn.setex('img_%s' % uuid, 300, text)
# 响应图形验证码: image/jpg
return http.HttpResponse(image, content_type='image/jpg')