bbs项目之登录功能

宁睿  金牌会员 | 2022-9-16 17:17:26 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 959|帖子 959|积分 2887

登陆功能

需要有登录用户名,密码,动态生成验证码和提交按钮,具体效果如下:

需要先了解的知识点:
  1. 1.img标签的src属性可以放以下三种:
  2.         1.图片路径
  3.         2.url
  4.         3.图片的二进制数据
  5. 2.我们的计算机上面致所有能够输出各式各样的字体样式
  6. 内部其实对应的是一个个.ttf结尾的文件,免费的ttf字体样式可以去下面这个网址下载使用。
  7. http://www.zhaozi.cn/ai/2019/fontlist.php?ph=1&classid=32&softsq=%E5%85%8D%E8%B4%B9%E5%95%86%E7%94%A8
  8. 3.介绍一下新的图片相关的模块
  9. 先安装
  10. pip3 install pillow
  11. 再导入
  12. from PIL import Image,ImageDraw,ImageFont
  13. Image:生成图片用的
  14. ImageDraw:能够在图片上乱涂乱画
  15. ImageFont:控制字体样式
  16. 4.内存管理器模块
  17. from io import BytesIO,StringIO
  18. BytesIO:临时帮你存储数据 返回的时候数据是二进制
  19. StringIO:临时帮你存储数据 返回的时候数据是字符串
复制代码
视图函数部分
  1. import random
  2. from PIL import Image,ImageDraw,ImageFont
  3. from io import BytesIO,StringIO
  4. def get_random():
  5.     return random.randint(0,255),random.randint(0,255),random.randint(0,255)
  6. def get_code(request):
  7.     # 推导步骤1:直接获取后端现成的图片二进制数据发送给前端
  8.     # with open(r'static/img/111.jpg','rb') as f:
  9.     #     data = f.read()
  10.     # return HttpResponse(data)
  11.     # 推导步骤2:利用pillow模块动态产生图片
  12.     # img_obj = Image.new('RGB',(430,35),'green')
  13.     # img_obj = Image.new('RGB',(430,35),get_random())
  14.     # # 先将图片对象保存起来
  15.     # with open('xxx.png','wb') as f:
  16.     #     img_obj.save(f,'png')
  17.     # # 再将图片对象读取出来
  18.     # with open('xxx.png','rb') as f:
  19.     #     data = f.read()
  20.     # return HttpResponse(data)
  21.     # 推导步骤3:文件存储繁琐IO操作效率低  借助于内存管理器模块
  22.     # img_obj = Image.new('RGB', (430, 35), get_random())
  23.     # io_obj = BytesIO()  # 生成一个内存管理器对象  你可以看成是文件句柄
  24.     # img_obj.save(io_obj,'png')
  25.     # return HttpResponse(io_obj.getvalue())  # 从内存管理器中读取二进制的图片数据返回给前端
  26.     # 最终步骤4:写图片验证码
  27.     img_obj = Image.new('RGB', (430, 35), get_random())
  28.     img_draw = ImageDraw.Draw(img_obj)  # 产生一个画笔对象
  29.     img_font = ImageFont.truetype('static/font/222.ttf',30)  # 字体样式 大小
  30.     # 随机验证码  五位数的随机验证码  数字 小写字母 大写字母
  31.     code = ''
  32.     for i in range(5):
  33.         random_upper = chr(random.randint(65,90))
  34.         random_lower = chr(random.randint(97,122))
  35.         random_int = str(random.randint(0,9))
  36.         # 从上面三个里面随机选择一个
  37.         tmp = random.choice([random_lower,random_upper,random_int])
  38.         # 将产生的随机字符串写入到图片上
  39.         """
  40.         为什么一个个写而不是生成好了之后再写
  41.         因为一个个写能够控制每个字体的间隙 而生成好之后再写的话
  42.         间隙就没法控制了
  43.         """
  44.         img_draw.text((i*60+60,-2),tmp,get_random(),img_font)
  45.         # 拼接随机字符串
  46.         code += tmp
  47.     print(code)
  48.     # 随机验证码在登陆的视图函数里面需要用到 要比对 所以要找地方存起来并且其他视图函数也能拿到
  49.     request.session['code'] = code
  50.     io_obj = BytesIO()
  51.     img_obj.save(io_obj,'png')
  52.     return HttpResponse(io_obj.getvalue())
复制代码
html部分
  1. <body>
  2.    
  3.         
  4.             
  5.                 <h1 >登录</h1>
  6.                 <label for="id_username">用户名</label>
  7.                 <input type="text"  id="id_username">
  8.                 <label for="id_password">密码</label>
  9.                 <input type="password"  id="id_password">
  10.             
  11.             
  12.                 <label for="">验证码</label>
  13.                
  14.                     
  15.                         <input type="text" >
  16.                     
  17.                     
  18. {#                        这里img标签的src属性放的是一个url,访问页面时,会自动向这个地址请求拿到图片数据#}
  19.                         <img src="https://www.cnblogs.com/get_code" alt="" width="350" height="35" id="commit">
  20.                     
  21.                
  22.             
  23.             <input type="button"  value="登录">
  24.         
  25.    
  26. </body>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宁睿

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表