验证码生成

缺乏、安全感 2022-06-03 02:23 426阅读 0赞

视图函数里

1,导入图片,画布,画笔,画笔上的字体,定义坐标
2,从外部导入字体(字体导入到static静态中)
3,随机生成验证码,验证码颜色,验证码背景,给验证码加干扰点
4,清理垃圾
5,把验证码导入到对应的页面上
6, 验证码更新策略(浏览器在处理图片地址设置的时候,如果图片地址没有改变,
而内容发生了改变,浏览器不会认为发生了改变,导致图片不能正常刷新)

  1. 解决图片更新问题方案,在地址最后拼接时间戳
  2. 验证使用的session缓存的验证码
  1. import random
  2. from PIL import Image, ImageDraw, ImageFont
  3. from django.http import HttpResponse
  4. from django.shortcuts import render, redirect
  5. # Create your views here.
  6. # timestamp参数是定义的时间戳
  7. def getVerifyCode(request, timestamp):
  8. # 绘制验证码,画布,画笔,画笔字体
  9. imageMode = 'RGB'
  10. imageSize = (100, 50)
  11. red = random.randrange(0, 255)
  12. green = random.randrange(0, 255)
  13. blue = random.randrange(0, 255)
  14. imageColor = (red, green, blue)
  15. # 画布完成 imageMode画布颜色 imageSize画布大小
  16. image = Image.new(imageMode, imageSize, imageColor)
  17. # 画笔
  18. imageDrwaw = ImageDraw.Draw(image)
  19. # 文本坐标
  20. xy = (10, 10)
  21. # 导入字体 ()字体路径,字体大小
  22. imageFont = ImageFont.truetype('static/fonts/ADOBEARABIC-BOLD.OTF', 30)
  23. # 随机生成四个大写字母
  24. verifyCode = ''
  25. for i in range(4):
  26. num = random.randrange(65, 91)
  27. letter = chr(num)
  28. verifyCode += letter
  29. # 把当下的四个随机数的数字赋给session
  30. request.session["verifycode"] = verifyCode
  31. x = 5
  32. # 验证码的颜色
  33. for l in verifyCode:
  34. fred = random.randrange(0, 255)
  35. fgreen = random.randrange(0, 255)
  36. fblue = random.randrange(0, 255)
  37. fontColor = (fred, fgreen, fblue)
  38. # 验证码的位置
  39. xy = (x, 10)
  40. x += 20
  41. imageDrwaw.text(xy, l, font=imageFont, fill=(0, 0, 255))
  42. # 验证码加点
  43. for i in range(300):
  44. x = random.randrange(0, 100)
  45. y = random.randrange(0, 50)
  46. xy = (x, y)
  47. pred = random.randrange(0, 256)
  48. pgreen = random.randrange(0, 256)
  49. pblue = random.randrange(0, 256)
  50. pColor = (pred, pgreen, pblue)
  51. imageDrwaw.point(xy, pColor)
  52. # 清理垃圾
  53. del imageDrwaw
  54. # 使用IO将画布转换成流,输出
  55. import io
  56. # 缓冲区
  57. buffer = io.BytesIO()
  58. # 将image导入到缓冲区
  59. image.save(buffer, 'png')
  60. return HttpResponse(buffer.getvalue(), 'image/png')
  61. # 进入登录页面
  62. def verifycode(request):
  63. return render(request, 'youapp/verifycode.html')
  64. # 验证
  65. def doverifycode(request):
  66. # 获取用户输入的验证码的值
  67. verifycode = request.POST.get('verifycode')
  68. # 在生成验证码的地方获取session,
  69. cacaverifycode = request.session.get('verifycode')
  70. # 判断比较
  71. if verifycode == cacaverifycode:
  72. return HttpResponse('欢迎来到王者荣耀')
  73. else:
  74. # 这里不能用重定向
  75. return HttpResponse('王者荣耀')
  76. # return redirect("/youapp/verifycode/")
  77. # 富文本 pip install django-tinymce
  78. def rtfblog(request):
  79. return render(request, 'youapp/blog.html')

在HTML页面里

  1. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>验证码</title> {# 导入jq#} <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script> <script> $(function () { $("#ww").click(function () { {#Date.now()时间戳 #} $('#verify_img').prop("src", "http://127.0.0.1:8000/youapp/getverifycode/" + Date.now()); }) }) </script> <style> #ww { background: #00ff00; width: 100px; } </style> </head> <body> <form action="{% url 'youapp:doverifycode' %}" method="post"> {% csrf_token %} <span>验证码</span><input type="text" name='verifycode' placeholder="请输入验证码"> {# 验证码的图传进来 1 是传入的参数,默认值#} <img id="verify_img" src="{% url 'youapp:getVerifyCode' 1 %}"> <br> <div id='ww'>更换验证码</div> <input type="submit" value="提交"> </form> </body> </html>

配置路径

  1. from django.conf.urls import url
  2. from youapp import views
  3. urlpatterns = [
  4. url(r'^getverifycode/(\d+)', views.getVerifyCode, name='getVerifyCode'),
  5. url(r'^verifycode', views.verifycode, name='verifycode'),
  6. url(r'^doverifycode', views.doverifycode, name='doverifycode'),
  7. url(r'^rtfblog', views.rtfblog, name='rtfblog'),
  8. ]

发表评论

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

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

相关阅读

    相关 验证生成

    视图函数里 > 1,导入图片,画布,画笔,画笔上的字体,定义坐标 > 2,从外部导入字体(字体导入到static静态中) > 3,随机生成验证码,验证码颜色,验证