【Python】多种方式实现生成验证码

多种方式实现生成验证码

1.生成随机n位验证码

import random
def make_random_code(n):
    res = ''
    for i in range(n):
        s = chr(random.randint(65,90))
        num = str(random.randint(0,9))
        res += random.choice([s,num])
    return res
print(make_random_code(6))

2.生成随机背景颜色的n位验证码(Django版本)

urls.py

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),
]

views.py

from django.shortcuts import *
from PIL import Image,ImageDraw,ImageFont
# 内存管理,把图片放在内存里
from io import BytesIO
import random

# Create your views here.

def login(request):
    return render(request,'login.html')



def get_random_color():
    return (random.randint(0,255),random.randint(0,255),random.randint(0,255))


def get_code(request):
    # 方式一
    # with open('./static/image/miao1.png','rb')as f :
    #     data = f.read()
    # 方式二
    # pip3 install pillow
    # from PIL import Image,ImageFont,ImageDraw
    # Image.new('颜色类型','长宽','颜色')
    img = Image.new('RGB',(125,35),color=get_random_color())
    # 指定字体文件
    font = ImageFont.truetype('./static/font/kumo.ttf',30)
    # ImageDraw.Draw(img)
    draw = ImageDraw.Draw(img)
    valid_code = ''
    # 验证码显示方式一:
    # draw.text((X轴,Y轴),'显示内容','颜色')
    # draw.text((5,5),'python',get_random_color(),font=font)
    # 验证码显示方式二:
    for i in range(4):
        random_num = str(random.randint(0,9))
        random_upper = chr(random.randint(65,90))
        random_lower = chr(random.randint(97,122))
        random_chr = random.choice([random_num,random_lower,random_upper])
        draw.text((i*30+10,5),random_chr,get_random_color(),font=font)
        valid_code += random_chr
    print(valid_code)
    # 存到session里
    request.session['valid_code'] = valid_code
    # 生成一个内存管理对象
    f = BytesIO()
    # 将图片保存至f对象内,指定格式为png
    img.save(f,'png')
    # 从内存中取出
    data = f.getvalue()


    return HttpResponse(data)
views.py

login.htnl(存在继承母版,自行修改)

{% extends 'base.html' %}
{% block page-title %}
    <title>登录</title>
{% endblock %}
{% block page-css %}
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
    <link rel="stylesheet" href="/static/fontawesome/css/font-awesome.min.css">
{% endblock %}
{% block page-main %}
    <div class="row">
        <div class="col-md-4" style="margin-top: 50px;">
            <img src="/static/image/1.png" alt="">
        </div>
        <div class="col-md-6  col-md-offset-2" style="margin-top: 80px">
            <h2 style="padding-left: 60px;text-align: center;margin-bottom: 50px">用户登录</h2>
            <form class="form-horizontal" action="#" method="post">
                {% csrf_token %}
                <div class="form-group">
                    <label for="id_username" class="col-sm-2 control-label">账号</label>
                    <div class="col-sm-10">
                        <input type="text" class="form-control" id="id_username" placeholder="请输入用户名、邮箱、手机号"
                               name="username">
                    </div>
                </div>
                <div class="form-group">
                    <label for="id_password" class="col-sm-2 control-label">密码</label>
                    <div class="col-sm-10">
                        <input type="password" class="form-control" id="id_password" placeholder="请输入密码"
                               name="userpwd">
                    </div>
                </div>
                <div class="form-group">
                    <lable for="valid_code" class="col-sm-2 control-label">验证码</lable>
                    <div class="col-sm-7">
                        <input type="text" class="form-control" id="valid_code">
                    </div>
                    <div class="col-sm-3" style="padding: 0 10px">
                        <img style="width: 125px" src="/get_code/" id="cod_img">
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-sm-offset-2 col-sm-10">
                        <button type="submit" class="btn btn-success" style="width: 457px" id="submit_btn">登录</button>
                    </div>
                    <div class="col-sm-offset-2 col-sm-10" style="margin-top: 10px;color: red">
                        {{ error }}
                    </div>
                </div>
            </form>
        </div>
    </div>
{% endblock %}
{% block page-js %}
    <script src="/static/jquery-3.3.1.js"></script>
    <script src="/static/bootstrap/js/bootstrap.min.js"></script>
    <script>
        $('#cod_img').click(function () {
            $('#cod_img')[0].src = $('#cod_img')[0].src + '?';
        })
    </script>
{% endblock %}
login.html

3.极客验证

 


 

posted @ 2018-09-19 08:58  NeymarGoal  阅读(303)  评论(0编辑  收藏  举报