python+Django自己生成验证码

1.views.pyfrom django.shortcuts import render, HttpResponsefrom django.http import JsonResponse

from django.contrib import authfrom PIL import Image, ImageDraw, ImageFontimport randomfrom io import BytesIO

# Create your views here.

# 自己生成验证码的登录

def login(request):    if request.method == "POST":        # 初始化一个给AJAX返回的数据        ret = {"status": 0, "msg": ""}        # 从提交过来的数据中 取到用户名和密码        username = request.POST.get("username")        pwd = request.POST.get("password")        valid_code = request.POST.get("valid_code")  # 获取用户填写的验证码        if valid_code and valid_code.upper() == request.session.get("valid_code", "").upper():            # 验证码正确            # 利用auth模块做用户名和密码的校验            user = auth.authenticate(username=username, password=pwd)            if user:                # 用户名密码正确                # 给用户做登录                auth.login(request, user)                ret["msg"] = "/index/"            else:                # 用户名密码错误                ret["status"] = 1                ret["msg"] = "用户名或密码错误!"        else:            ret["status"] = 1            ret["msg"] = "验证码错误"

return JsonResponse(ret)    return render(request, "login.html")

# 获取验证码图片的视图def get_valid_img(request):    # 获取随机颜色的函数    def get_random_color():        return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)

# 生成一个图片对象    img_obj = Image.new(        ‘RGB‘,        (220, 35),        get_random_color()    )    # 在生成的图片上写字符    # 生成一个图片画笔对象    draw_obj = ImageDraw.Draw(img_obj)    # 加载字体文件, 得到一个字体对象    font_obj = ImageFont.truetype("static/font/kumo.ttf", 28)    # 开始生成随机字符串并且写到图片上    tmp_list = []    for i in range(5):        u = chr(random.randint(65, 90))  # 生成大写字母        l = chr(random.randint(97, 122))  # 生成小写字母        n = str(random.randint(0, 9))  # 生成数字,注意要转换成字符串类型

tmp = random.choice([u, l, n])        tmp_list.append(tmp)        draw_obj.text((20 + 40 * i, 0), tmp, fill=get_random_color(), font=font_obj)

# 保存到session    request.session["valid_code"] = "".join(tmp_list)    # 加干扰线    width = 220  # 图片宽度(防止越界)    height = 35    for i in range(5):        x1 = random.randint(0, width)        x2 = random.randint(0, width)        y1 = random.randint(0, height)        y2 = random.randint(0, height)        draw_obj.line((x1, y1, x2, y2), fill=get_random_color())

# 加干扰点    for i in range(40):        draw_obj.point((random.randint(0, width), random.randint(0, height)), fill=get_random_color())        x = random.randint(0, width)        y = random.randint(0, height)        draw_obj.arc((x, y, x+4, y+4), 0, 90, fill=get_random_color())

# 不需要在硬盘上保存文件,直接在内存中加载就可以    io_obj = BytesIO()    # 将生成的图片数据保存在io对象中    img_obj.save(io_obj, "png")    # 从io对象里面取上一步保存的数据    data = io_obj.getvalue()    return HttpResponse(data)

2.urls.py
from django.conf.urls import urlfrom django.contrib import adminfrom app01 import views

urlpatterns = [    url(r‘^admin/‘, admin.site.urls),    url(r‘^login/‘, views.login),    url(r‘^get_valid_img.png/‘, views.get_valid_img),]

3.login.html
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>欢迎登录</title>    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">    <link rel="stylesheet" href="/static/mystyle.css"></head><body>

<div class="container">    <div class="row">        <form class="form-horizontal col-md-6 col-md-offset-3 login-form">            {% csrf_token %}            <div class="form-group">                <label for="username" class="col-sm-2 control-label">用户名</label>                <div class="col-sm-10">                    <input type="text" class="form-control" id="username" name="username" placeholder="用户名">                </div>            </div>            <div class="form-group">                <label for="password" class="col-sm-2 control-label">密码</label>                <div class="col-sm-10">                    <input type="password" class="form-control" id="password" name="password" placeholder="密码">                </div>            </div>            <div class="form-group">                <label for="password" class="col-sm-2 control-label">验证码</label>                <div class="col-sm-10">                    <input type="text" name="valid_code" id="valid_code">                    <img id="valid-img" class="valid-img" src="/get_valid_img.png?" >                </div>            </div>            <div class="form-group">                <div class="col-sm-offset-2 col-sm-10">                    <button type="button" class="btn btn-default" id="login-button">登录</button>                    <span class="login-error"></span>                </div>            </div>        </form>    </div></div><script src="/static/jquery-3.3.1.js"></script><script src="/static/bootstrap/js/bootstrap.min.js"></script><script>    $("#login-button").click(function () {        // 1. 取到用户填写的用户名和密码 -> 取input框的值        var username = $("#username").val();        var password = $("#password").val();        var valid_code = $("#valid_code").val();        // 2. 用AJAX发送到服务端        $.ajax({            url: "/login/",            type: "post",            data: {                "username": username,                "password": password,                "valid_code": valid_code,                "csrfmiddlewaretoken": $("[name=‘csrfmiddlewaretoken‘]").val()            },            success: function (data) {                console.log(data);                if (data.status) {                    // 有错误,在页面上提示                    $(".login-error").text(data.msg);                } else {                    // 登陆成功                    location.href = data.msg;                }            }        })    });

// 当input框获取焦点时将之前的错误清空    $("#username,#password").focus(function () {        // 将之前的错误清空        $(".login-error").text("");    });

// 点击验证码图片 刷新验证码    $("#valid-img").click(function () {        $(this)[0].src += "?";    })</script></body></html>


原文地址:https://www.cnblogs.com/Guishuzhe/p/9594192.html

时间: 2024-11-10 07:01:08

python+Django自己生成验证码的相关文章

Django随机生成验证码图片

PIL简介 什么是PIL PIL:是Python Image Library的缩写,图像处理的模块.主要的类包括Image,ImageFont,ImageDraw,ImageFilter PIL的导入 首先需要安装一下pillow包 ? 1 pip install pillow 然后就可以调用PIL里的类了 ? 1 2 3 4 from PIL import Image from PIL import ImageFont from PIL import ImageDraw from PIL im

Django 生成验证码或二维码 pillow模块

一.安装PIL PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,API也非常简单易用. ? PIL模块只支持到Python 2.7,许久没更新了,在python 3.* 版本上使用Pillow模块 ? 安装Pillow ? pip install pillow 二.pillow 基本使用 图像缩放 from PIL import Image # 当前路径打开一个jpg图像文件 img = Image.open('test.

用python生成验证码图片

除了配置好的python环境外,还需要配有python中的PIL库,这是python中专门用来处理图片的库.用传统的pip install 方法或者下载源码 python setup.py install 方法安装该库,很可能会报错(视运行环境不同).可以采用以下方法: 1.下载安装包URL:http://www.pythonware.com/products/pil/index.htm,要下载支持全平台的. 2.解压缩: tar –zxv –f Imaging-1.1.7.tar.gz 3.进

Python Show-Me-the-Code 第 0010 题 生成验证码图片

第 0010 题:使用 Python 生成类似于下图中的字母验证码图片 阅读资料 思路:先随机生成验证码,然后用Python的PIL库画出这个激活码的图片,具体点就是创建画布,加验证码的字上去,增加噪点进行干扰,再进行模糊处理,接着保存到名字为验证码的图片中. 0010.生成验证码图片.py #!/usr/bin/env python #coding: utf-8 import Image, ImageDraw, ImageFont, ImageFilter import string, ran

Python图片处理PIL/pillow/生成验证码/出现KeyError: 和The _imagingft C module is not installed

最近在用Python开发自己的博客,需要用到Python生成验证码,当然肯定要用到Python的图形处理库PIL,因为我用的是windows. 所以在安装好pil之后就开始写,就按照题目所说出现了The _imagingft C module is not installed 错误,找了很多建议,最后确定在windows下应该用pillpw.下载地址 点击打开链接 找到 Pillow?2.5.2.win32?py2.7.exe因为我用的是python2.7和win32系统,所以就应该下载这个,大

三条代码 搞定 python 生成验证码

C:\Users\DELL>python Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import qrc

随机生成验证码及python中的事务

1.随机生成验证码 # import random # print(random.random()) #0-1的小数 # print(random.randint(1,3)) #包括1和3 # print("--",random.randrange(1,3)) #不包括1和3 #随机生成四位验证码 import random checkcode = '' for i in range(4): current = random.randrange(0,4) if current != i

Python随机生成验证码的两种方法

Python随机生成验证码的方法有很多,今天给大家列举两种,大家也可以在这个基础上进行改造,设计出适合自己的验证码方法方法一:利用range Python随机生成验证码的方法有很多,今天给大家列举两种,大家也可以在这个基础上进行改造,设计出适合自己的验证码方法 方法一: 利用range方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # -*- coding: utf-8 -*- import random def generate_verification_c

python的random模块(生成验证码)

python的random模块(生成验证码) random模块常用方法 random.random() #生成0到1之间的随机数,没有参数,float类型 random.randint(1, 3) #生成参数1到参数2之间的随机数,输出为int类型,[1,3] random.randrange(1, 3) #生成参数1到参数2之间的随机数,输出为int类型,[1,3),这个方法还有一种用法,就是下面介绍的这种 random.randrange(0,100,2) #从指定范围内,按指定基数递增的集