在这里将生成的图片验证码存入了reids,因为存session存在浏览器同源策略的问题,在取的时候取不出来,要解决同源策略的问题,可以在vue中的main.js文件中加入一行代码,不过我自己测试的时候加了这行代码也没用,还是获取不到session存的值
/* 浏览器同源策略,所以在后端拿不到session,加入这行代码就能拿到了 */
Axios.defaults.withCredentials = true;
- views.py
# 导入图片库
# 绘画库
from PIL import ImageDraw
# 字体库
from PIL import ImageFont
# 图片库
from PIL import Image
# 随机库
import random
# 文件流
import io
# 定义验证码类
class MyCode(View):
# 定义随机取色方法
def get_random_color(self):
R = random.randrange(255)
G = random.randrange(255)
B = random.randrange(255)
return (R,G,B)
def get(self,request):
# 定义画布
img_size = (120,50)
# 定义图像,颜色种类,画布,背景颜色
image = Image.new('RGB',img_size,'white')
# 定义画笔
draw = ImageDraw.Draw(image,'RGB')
# 随机字符串的组成
source = '01234567890asdfgw'
# 定义容器
code_str = ''
for i in range(4):
# 取色
text_color = self.get_random_color()
# 获取一个字符串
tmp_num = random.randrange(len(source))
# 获取字符集
random_str = source[tmp_num]
# 将随机生成的字符串放入定义的容器
code_str += random_str
# 将文字输入绘图
draw.text((10+30*i,20),random_str,text_color)
# 建立io文件流
buf = io.BytesIO()
# 保存内存中
image.save(buf,'png')
# 将验证码放入到session
# 测试redis
import redis
# 建立连接
r = redis.Redis('localhost')
r.set('mykey',code_str) # 根据key,value的形式存入
# request.session['code'] = code_str
# print(request.session['code'])
# 返回文件流图像
return HttpResponse(buf.getvalue(),'image/png')
#注册接口
class Register(APIView):
def get(self,request):
#接收参数
username = request.GET.get('username','未收到用户名')
password = request.GET.get('password','未收到密码')
#获取随机验证码
code = request.GET.get('code','未收到验证码')
# #获取session中的验证码
# mycode = request.session.get('code',None)
# print(mycode)
import redis
r = redis.Redis('localhost')
mycode = r.get('mykey') # 在这里获取存入的mykey
# 转码
mycode = mycode.decode('utf-8')
print(mycode)
if code != mycode:
res = {}
res['code'] = 405
res['message'] = '验证码输入错误'
return Response(res)
#排重操作
user = User.objects.filter(username=username).first()
if user:
res = {}
res['code'] = 405
res['message'] = '用户已经存在'
return Response(res)
#进行入库逻辑 加密
user = User(username=username,password=make_password(password),type=0)
#保存
user.save()
#返回结果
res = {}
res['code'] = 200
res['message'] = '注册成功'
return Response(res)
本文探讨了在后端生成并使用Redis存储图片验证码的方法,解决了Vue项目中的跨域问题,通过设置Axios的withCredentials属性,实现了跨域情况下从后端获取session数据。
909

被折叠的 条评论
为什么被折叠?



