• Django框架之验证码生成示例


    一、生成随机颜色的图片

    1)前端代码展示

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.min.css">
        <script src="/static/jquery-3.1.1.js"></script>
        <title>登录页面</title>
    </head>
    <body>
    
    
    <div class="container-fluid">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <h1>登录</h1>
                <form>
                    <div class="form-group">
                        <label for="">用户名</label>
                        <input type="text" id="id_name" class="form-control">
                    </div>
    
                    <div class="form-group">
                        <label for="">密码</label>
                        <input type="password" id="id_pwd" class="form-control">
                    </div>
    
                    <div class="form-group">
                        <label for="">验证码</label>
                        <div class="row">
                            <div class="col-lg-6">
                                <input type="text" id="code" class="form-control">
                            </div>
                            <div class="col-lg-6">
                                <img height="35" width="250" src="/get_code/" alt="">
                            </div>
                        </div>
                    </div>
                    <input type="button" value="登录" class="btn btn-danger">
                </form>
    
            </div>
        </div>
    </div>
    
    </body>
    </html>
    login.html

    提交方式,基于ajax提交

    2)生成随机颜色的图片

    def get_random_color():
        '''生成随机颜色的图片'''
        import random
        return (random.randint(0,255),random.randint(0,255),random.randint(0,255))
    get_random_color

    3)验证码函数,写入图片,读取图片返回给前端

    def get_code(request):
        from PIL import Image
        img = Image.new('RGB',(35,250),color=get_random_color())
        with open('code.png','wb') as f:    # 造成随机颜色的图片
            img.save(f)
    
        with open('code.png','rb') as f:    # 读取图片,给前端
            data=f.read()
    
        return HttpResponse(data)
    get_code

    二、在随机验证码图片内写入文字.(重点)

    随机生成的验证码图片,保存于内存。图片内的文字保存于session(用于登录验证)

    def get_code(request):
        from PIL import Image, ImageDraw, ImageFont
        from io import BytesIO  # 生成的验证码存放于内存
        import random
        img = Image.new("RGB", (270, 40), color=get_random_color())
        # (270, 40) 指定生成的图片的长度,高度
        draw = ImageDraw.Draw(img)
        # kumo.ttf 文字样式,网上下载ttf
        kumo_font = ImageFont.truetype("static/font/kumo.ttf", size=32)     # 引入字体
    
        valid_code_str = ""
        for i in range(5):
            random_num = str(random.randint(0, 9))  # 随机一个数字
            random_low_alpha = chr(random.randint(95, 122)) # 随机一个小写字母
            random_upper_alpha = chr(random.randint(65, 90))    # 随机一个大写字母
            random_char = random.choice([random_num, random_low_alpha, random_upper_alpha])     # 从上面的3个选择一个出来
            draw.text((i * 50 + 20, 5), random_char, get_random_color(), font=kumo_font)   # (i * 50 + 20, 5) 写字母的时候便宜
    
            # 保存验证码字符串
            valid_code_str += random_char
    
        print("valid_code_str", valid_code_str)
        f = BytesIO()   # 生成一个对象,保存于内存
        img.save(f, "png")  # 验证码图片保存于内存
        data = f.getvalue()
        request.session['code']=valid_code_str  # 验证码保存于session中
    
        return HttpResponse(data)
    get_code

     三、加入ajax请求登录

    1)url视图函数

    from django.conf.urls import url
    from django.contrib import admin
    from mybbs import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^login/', views.login),
        url(r'^get_code/', views.get_code),
    ]
    url.py

    2)login页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.min.css">
        <script src="/static/jquery-3.1.1.js"></script>
        <title>登录页面</title>
    </head>
    <body>
    
    
    <div class="container-fluid">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <h1>登录</h1>
                <form>
                    {% csrf_token %}
                    <div class="form-group">
                        <label for="">用户名</label>
                        <input type="text" id="id_name" class="form-control">
                    </div>
    
                    <div class="form-group">
                        <label for="">密码</label>
                        <input type="password" id="id_pwd" class="form-control">
                    </div>
    
                    <div class="form-group">
                        <label for="">验证码</label>
                        <div class="row">
                            <div class="col-lg-6">
                                <input type="text" id="code" class="form-control">
                            </div>
                            <div class="col-lg-6">
                                <img height="35" width="250" src="/get_code/" alt="">
                            </div>
                        </div>
                    </div>
                    <input type="button" id="submit" value="登录" class="btn btn-danger">
                </form>
    
            </div>
        </div>
    </div>
    
    
    <script>
        $("#submit").click(function () {
            $.ajax({
                url: '/login/',
                type: 'post',
                data: {
                    'name': $("#id_name").val(),
                    'pwd': $("#id_pwd").val(),
                    'code': $("#code").val(),
                    'csrfmiddlewaretoken': '{{csrf_token}}'
                },
                success: function (data) {
                    console.log(data)
                }
            })
        })
    </script>
    </body>
    </html>
    login.html

    3)验证码相关函数

    def get_random_color():
        '''生成随机颜色的图片'''
        import random
        return (random.randint(0,255),random.randint(0,255),random.randint(0,255))
    
    
    def get_code(request):
        from PIL import Image, ImageDraw, ImageFont
        from io import BytesIO  # 生成的验证码存放于内存
        import random
        img = Image.new("RGB", (270, 40), color=get_random_color())
        # (270, 40) 指定生成的图片的长度,高度
        draw = ImageDraw.Draw(img)
        # kumo.ttf 文字样式,网上下载ttf
        kumo_font = ImageFont.truetype("static/font/kumo.ttf", size=32)     # 引入字体
    
        valid_code_str = ""
        for i in range(5):
            random_num = str(random.randint(0, 9))  # 随机一个数字
            random_low_alpha = chr(random.randint(95, 122)) # 随机一个小写字母
            random_upper_alpha = chr(random.randint(65, 90))    # 随机一个大写字母
            random_char = random.choice([random_num, random_low_alpha, random_upper_alpha])     # 从上面的3个选择一个出来
            draw.text((i * 50 + 20, 5), random_char, get_random_color(), font=kumo_font)   # (i * 50 + 20, 5) 写字母的时候便宜
    
            # 保存验证码字符串
            valid_code_str += random_char
    
        print("valid_code_str", valid_code_str)
        f = BytesIO()   # 生成一个对象,保存于内存
        img.save(f, "png")  # 验证码图片保存于内存
        data = f.getvalue()
        request.session['code']=valid_code_str  # 验证码保存于session中
    
        return HttpResponse(data)
    验证码相关请求函数

    4)login函数请求(判断ajax)

    from django.contrib import auth
    def login(request):
        if request.is_ajax():
            name=request.POST.get('name')
            pwd=request.POST.get('pwd')
            code=request.POST.get('code')
    
            if code.upper()== request.session['code'].upper():
                user=auth.authenticate(request,username=name,password=pwd)
                if user:
                    return HttpResponse('ok')
                else:
                    return HttpResponse('用户名或密码错误')
            else:
                return HttpResponse('验证码错误')
    
        return render(request,'login.html')
    Views.login
  • 相关阅读:
    VUE assets里的scss没有引用会被打包进代码里,本地代码和打包后的代码样式不一致解决办法
    echarts图表配置
    关于哈希路由多项目部署同一个服务器的链接访问问题
    git操作失误,提交代码因为网络问题没有成功,然后操作时候点错按钮导致代码全部没有了,也没用备份,如何解决
    浏览器刷新时候不删除信息,关闭后删除用户信息处理办法,浏览器监听刷新以及删除事件、cookie、session、sessionStorage、localStorage区别
    angular打包部署设置publicPath文件目录及访问地址,解决打包完成后,运行打包文件,报错404,js,css未找到
    Oracle spatial与arcsde 的关系
    Oracle Spatial图层元数据坐标范围影响R-TREE索引的ROOT MBR吗?
    centos下安装supervisor的步骤详解
    laravel 队列
  • 原文地址:https://www.cnblogs.com/linu/p/9741889.html
Copyright © 2020-2023  润新知