首页 > 其他分享 >登录页面--图片验证码

登录页面--图片验证码

时间:2023-10-26 15:35:14浏览次数:27  
标签:code randint -- random 验证码 width font 页面

登陆界面实现图片验证码功能

 开始吧!!!

如何生成图片呢

安装pillow模块

pip install pillow

 

新建myproject/app01/utils/ttf目录,将字体放在其下

新建myproject/app01/utils/code.py,编辑验证码生成函数

from PIL import Image, ImageDraw, ImageFilter, ImageFont
import random


def check_code(width=120, height=30, char_length=5, font_file='app01/utils/ttf/Monaco.ttf', font_size=28):
    code = []
    img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
    draw = ImageDraw.Draw(img, mode='RGB')

    def rndChar():
        """
        生成随机字母
        :return:
        """
        return chr(random.randint(65, 90))

    def rndColor():
        """
        生成随机颜色
        :return:
        """
        return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255))

    # 写文字
    font = ImageFont.truetype(font_file, font_size)
    for i in range(char_length):
        char = rndChar()
        code.append(char)
        h = random.randint(0, 4)
        draw.text([i * width / char_length, h], char, font=font, fill=rndColor())

    # 写干扰点
    for i in range(40):
        draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())

    # 写干扰圆圈
    for i in range(40):
        draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
        x = random.randint(0, width)
        y = random.randint(0, height)
        draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor())

    # 画干扰线
    for i in range(5):
        x1 = random.randint(0, width)
        y1 = random.randint(0, height)
        x2 = random.randint(0, width)
        y2 = random.randint(0, height)

        draw.line((x1, y1, x2, y2), fill=rndColor())

    img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
    return img, ''.join(code)

修改myproject/myproject/urls.py

path('image/code/', account.image_code),

还需要将该函数的URL加入访问白名单,使验证码链接可用
编辑myproject/app01/middleware/auth.py

        #排除那些不需要登录就能访问的页面
        # request.path_info  获取当前用户请求的URL
        if request.path_info in ["/login/", "/image/code/"]:
            return

修改myproject/app01/views/account.py,引入调用刚刚写的验证码生成函数 

from app01.utils.code import check_code
from django.shortcuts import HttpResponse
from io import BytesIO
def image_code(request):
    """生成图片验证码"""
    # 调用pillow函数,生成图片
    img, code_string = check_code()

    # 将图片保存到内存
    stream = BytesIO()
    img.save(stream, 'png')
    return HttpResponse(stream.getvalue())

修改myproject/app01t/templates/login.html  

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}">
    <style>
        .account {
            width: 400px;
            border: 1px solid #dddddd;
            border-radius: 5px;
            box-shadow: 5px 5px 20px #aaa;

            margin-top: 100px;
            margin-left: auto;
            margin-right: auto;
            padding: 20px 40px;
        }

        .account h2 {
            margin-top: 10px;
            text-align: center;
        }
    </style>
</head>
<body>
<div class="account">
    <h2>用户登录</h2>
    <form method="post" novalidate>
        {% csrf_token %}
        <div class="form-group">
            <label>用户名</label>
            {{ form.username }}
            <span style="color: red">{{ form.username.errors.0 }}</span>
        </div>
        <div class="form-group">
            <label>密码</label>
            {{ form.password }}
            <span style="color: red">{{ form.password.errors.0 }}</span>
        </div>
        <div class="form-group">
            <label for="id_code">图片验证码</label>
            <div class="row">
                <div class="col-xs-7">
                    <input type="text" name="code" class="form-control" placeholder="请输入图片验证码" required="" id="id_code">
                    <span style="color: red;"></span>
                </div>
                <div class="col-xs-5">
                    <img id="image_code" src="/image/code/">
                </div>
            </div>
        </div>
        <button type="submit" class="btn btn-primary">登录</button>
    </form>
</div>
</body>
</html>

 

 看下效果吧

 验证码的校验

接下来需要验证用户输入的验证码与生成的验证码是否一致

 

 

参照: https://www.cnblogs.com/wupeiqi/articles/5812291.html

 

标签:code,randint,--,random,验证码,width,font,页面
From: https://www.cnblogs.com/kekeeleven/p/17789515.html

相关文章

  • Vue3 子组件修改父组件传过来的值
    Vue3子组件修改父组件传过来的值1、在父组件中,找到引用的子组件,在引用中加入v-model例如:子组件是demo,需要穿的值为num这个有个温馨提示,(v-model+冒号+需要穿的值)这个v-model可以写多个<demov-model:num="num"></demo>//例如可以写多个需要修改多个传入的值<demov-mo......
  • 卸载wps之后office文件图标变白和默认打开软件改不了问题
    (3封私信/23条消息)卸载WPS后,桌面office文件图标变白,如何解决?-知乎(zhihu.com)  修复好之后就行,win11亲测可用......
  • redis - bitmap 使用
    1.设置bitmap setbit key01 setbitkey3 1 setbitkey 51 ->0,3,5为偏移量 ->二进制100101 2.BITCOUNT:统计被设置的二进制位数量 ......
  • 做题计划
    年更选手报道!luoguP3455[POI2007]ZAP-Queries莫比乌斯反演。令:\(a\leb\)求:\[\sum\limits_{i=1}^a\sum\limits_{j=1}^b[\gcd(i,j)=x]\]消掉\(x\):\[=\sum\limits_{i=1}^{\left\lfloor\frac{a}{x}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\frac{b}......
  • c# winfom从0学习开发开发OA、BPM工作流程与自定义表单系统(四)角色与权限管理
    角色对应菜单的功能,是为了方便用户相同角色的时候避免了单独为用户设置菜单权限用户后面只需要对应的选择角色即可享有角色下的导航功能 角色与菜单来控制首页按钮是都可以操作Enabled是true还是false//获取所有菜单按钮Enabled=false;varall_menu=Bll......
  • 好用的图片懒加载,图片可动态添加
    js: /* *LazyLoad-jQuerypluginforlazyloadingimages * *Copyright(c)2007-2013MikaTuupola * *LicensedundertheMITlicense: * http://www.opensource.org/licenses/mit-license.php * *Projecthome: * http://www.appelsiini......
  • 【企业分析】搞定设计公司
    【企业分析】搞定设计公司前言缘由:11月6号研招网需要网上确认,要提交证件照等材料。经同学介绍,使用了一下搞定设计,发现满足需要,可以在线抠图生成证件照。虽然我自己也可以用PS处理,但是我平时没怎么使用,有些生疏,并且PS处理过程太慢,不能一键搞定我的需要(虽然可以弄脚本,但是打开PS太慢,......
  • 无涯教程-Clojure - pop函数
    对于列表或队列,返回没有第一项的新列表/队列,对于向量,返回没有最后一项的新向量。pop-语法以下是语法。(popvec)参数   - "vec"是元素的向量集。返回值 - 返回不带最后一项的新向量。pop-示例(nsclojure.examples.example(:gen-class))(defnexamp......
  • 信息搜索:全文搜索功能是网站运营的助力点
    产品界面通常采用高信息密度和高交互密度的设计,这是为了满足用户对多功能和复杂业务的需求。为了使用户能够快速获取所需信息并完成任务,产品中广泛使用各种搜索功能,无论大小都会有搜索功能,以提高用户的信息获取和消费效率。而全文搜索是搜索功能中体验更好的一种模式。全文搜索功能......
  • 《精通Linux.第2版》PDF高清高质量电子书
    下载:https://pan.quark.cn/s/8c7434ccba69......