登录页面设计
图片相关的模块 #pip3 install pillow from PIL import Image,ImageDraw,ImageFont """ Image:生成图片 ImageDraw:能够在图片上乱写乱画 ImageFont:控制字体样式 """ from io import BytesIO,StringIo """ 内存管理器模块 BytesIO:临时帮你存储数据 返回的数据是二进制 StringIO:临时帮你存储数据 返回的数据是字符串 """ import random def get_random(): return random.randint(0,255),random.randint(0,255),random.randint(0,255) #推导步骤1:直接获取后端现成的图片二进制数据发送给前端 def get_code(request): with open(r'static/img/1.jpg','rb')as f: data=f.read() return HttpResponse(data) #推导步骤2:利用pillow模块动态产生图片 def get_code(request): # img_obj=Image.new('RGB',(400,40),'yellow') # img_obj=Image.new('RGB',(400,40),(23,54,78)) img_obj=Image.new('RGB',(400,40),get_random()) #先将图片对象保存起来 with open('xxx.png','wb')as f: img_obj.save(f,'png') #在将图片对象读取出来 with open('xxx.png','rb')as f: data=f.read() return HttpResponse(data) #推导步骤3 :文件存储繁琐IO效率低 借助内存管理器模块 def get_code(request): img_obj=Image.new('RGB',(400,40),get_random()) io_obj=BytesIO()#生成一个内存管理器对象 你可以看成是文件句柄 img_obj.save(io_obj,'png') return HttpResponse(io_obj.getvalue())#从内存管理器中读取二进制的图片数据返回给前端 #推导步骤4:写图片验证码 # 我们的计算机上面能够输出各种各样的字体样式,内部其实对应的是一个个.ttf结尾的文件 def get_code(request): img_obj = Image.new('RGB', (400, 40), get_random()) img_draw=ImageDraw.Draw(img_obj)#产生一个画笔对象 img_font=ImageFont.truetype('static/font/11.ttf',30)#字体样式 大小 #随机验证码 五位数随机验证码 数字 小写字母 大写字母 code='' for i in range(5): random_upper=chr(random.randint(65,90)) random_lower=chr(random.randint(97,122)) random_int=str(random.randint(0,9)) #从上面3个里面随机选一个 tmp=random.choice([random_upper,random_lower,random_int]) #将产生的随机字符串写入到图片上 """ 为什么一个个写不是生成好了在写 因为一个个写能够控制每个字体的间隙 而生成好之后再写没法控制字体的间距了 """ img_draw.text((i*45+60,-1),tmp,get_random(),img_font) #拼接随机字符串 code+=tmp print(code) #随机验证码在登录的视图函数里面需要用到 要比对 所有要找个地方存起来并且其他视图函数也能拿到 request.session['code']=code io_obj=BytesIO() img_obj.save(io_obj,'png') return HttpResponse(io_obj.getvalue()) """前端""" <div class="container-fluid"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <h1 class="text-center">登录页面</h1> <div class="form-group"> <label for="username">用户名</label> <input type="text" name="username" id="username" class="form-control"> </div> <div class="form-group"> <label for="password">密码</label> <input type="text" name="password" id="password" class="form-control"> </div> <div class="form-group"> <label for="">验证码</label> <div class="row"> <div class="col-md-6"> <input type="text" name="code" id="is_code" class="form-control"> </div> <div class="col-md-6"> <img src="/get_code/" alt="" id="id_img" width="400" height="40"> </div> </div> </div> <input type="button" class="btn btn-success" value="登录"> </div> </div> </div> <script> $('#id_img').click(function () { //1 先获取标签之前的src let oldVal = $(this).attr('src'); $(this).attr('src', oldVal += '?') }) </script>