64.django实现登录添加验证码功能

1.目的  

  现在我们一般访问网页都需要输入验证码,比如博客园,有的甚至是通过手机验证码实时登录。这样做的目的主要还是为了防止其他人的恶意访问,比如爬虫,下面就来看看验证码是如何实现的

2.演示

  这里我在项目下创建了一个utils文件,存放验证码文件,字体文件下载猛戳这里

utils/code.py

import random
from PIL import Image,ImageDraw,ImageFont,ImageFilter
def check_code(width=120, height=30, char_length=5, font_file=‘kumo.ttf‘, font_size=28):
    """
    生成一个120*30验证码框体,28字体,字体文件需自己导入
    char_length代表生成5个字母
    :return:
    """
    code = []   # 用于存放每个验证码
    img = Image.new(mode=‘RGB‘, size=(width, height), color=(255, 255, 255))
    draw = ImageDraw.Draw(img, mode=‘RGB‘)

    def rndChar():
        """
        生成随机字母A-Z
        :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)   # 循环了char_length次并追加进去
        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)

views.py

from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth
# 从utils文件夹下的code文件导入 check_code
from utils.code import check_code

def code(request):
    """
    生成图片验证码
    """
    img,random_code = check_code()
    request.session[‘random_code‘] = random_code
    from io import BytesIO
    # 实现了在内存中操作bytes
    stream = BytesIO()
    # 将二维码最终转为png格式
    img.save(stream, ‘png‘)
    return HttpResponse(stream.getvalue())

def login(request):
    """
    用户登陆
    """
    if request.method == ‘GET‘:
        return render(request,‘login.html‘)
    user = request.POST.get(‘user‘)
    pwd = request.POST.get(‘pwd‘)
    code = request.POST.get(‘code‘)
    if code.upper() != request.session[‘random_code‘].upper():
        return render(request,‘login.html‘,{‘msg‘:‘验证码错误‘})
    # 通过auth模块进行用户认证
    user = auth.authenticate(username=user,password=pwd)
    if user:
        return redirect(‘https://www.luffycity.com‘)
    return render(request, ‘login.html‘, {‘msg‘: ‘用户名或密码错误‘})

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="post">
        {% csrf_token %}
        <p>
            <input type="text" name="user" placeholder="用户名" />
        </p>
        <p>
            <input type="password" name="pwd" placeholder="密码" />
        </p>
        <p>
            <input type="text" name="code" placeholder="验证" />
            <img onclick="changeImg(this);" src="/code/"  title="点击更换">
        </p>
        <input type="submit" value="提交">{{ msg }}
    </form>
    <script>
        // 通过changeImg事件来更换图片
        function changeImg(ths) {
            ths.src = ths.src + ‘?‘;
            console.log(ths.src);
        }
    </script>
</body>
</html>

#  这里对于changeImg事件加问号还不是太明白

# 对于这里是如何利用random模块实现验证码功能的,详细内容可以参考这里

原文地址:https://www.cnblogs.com/LearningOnline/p/9346270.html

时间: 2024-08-23 07:36:27

64.django实现登录添加验证码功能的相关文章

CAS添加验证码功能

1.  cas.war 下面的web-inf/web.xml  lib添加  kaptcha.jar kaptcha.jar通过maven获取 <dependency> <groupId>com.github.axet</groupId> <artifactId>kaptcha</artifactId> <version>0.0.9</version> </dependency> 这个maven 包含两个 ja

WordPress优化:给后台登录添加验证码以及登录限制

为了防止后台被某些黑客进行密码爆破,添加验证码以及登录限制是很有必要的.这里我分享两个插件,分别是:SI CAPTCHA Anti-Spam 和 Limit Login Attempts .一个是验证码,另一个是限制登录尝试.这两个插件直接在网站后台搜索安装就可以了 开启两个插件后,后台登录效果如下: 好了,有兴趣的小伙伴可以试试O(∩_∩)O~

为 jumpserver跳板机 添加 验证码 功能

Jumpserver-VerificationCode 介绍 项目地址:Jumpserver-VerificationCode 本项目为jumpserver添加了企业微信验证码功能 使用方法 3个脚本放置与jumpserver根目录 修改 /etc/passwd 中的init.sh修改为NewInit.sh 效果图 原文地址:http://blog.51cto.com/2860664/2091667

C#WinForm 实现登录界面验证码功能(区分大小写+不区分大小写)

文章来自:https://blog.csdn.net/IT_xiao_guang_guang/article/details/104250015 一.功能界面 图1 验证码(区分大小写) 图2 验证码(不区分大小写) 二.创建一个产生验证码的类Class1 (1)生成随机验证码字符串,用的是Random随机函数 (2)创建验证码图片,将该字符串画在PictureBox控件中 Class1.cs: using System; using System.Collections.Generic; us

使用JS来实现验证码功能

最近想为自己的Django博客添加验证码功能,本来想使用第三方库来实现的,不过考虑到添加第三方库对性能的影响,以及第三方库是否安全可靠的问题,还是用自己的代码来实现吧.反正用JS来实现验证码功能又不是很难. 简单来说,用一个create_code()方法在页面中生成验证码,然后control_submit()方法检测验证码文本框(id="user_input_code")的键盘输入事件,当文本框输入了超过4个字符后,调用verify_code ()检测输入的字符与生成的验证码是否一致,

【SSO单点系列】(3):登录页验证码的添加

这一篇主要是讲解怎么在登录页上添加验证码功能,默认的登录页是只有用户名与密码功能.其他我觉得加验证码没什么用,因为现在我部门做的系统主要是放在内网里,外网是不能访问的.登录页的验证码主要是为了防止进账号进行暴力破解,不过我觉得客户估计也不会没事去搞这玩意.以上只是我自己的个人见解,可能有失偏颇,就当作是对客户的愤怒的一种发泄吧,大家看看就好,最近真是被客户搞得头都大了.不过,如果你的系统放在外网上,那验证码是必须要加上的 .  好了,牢骚发的差不多了,下面进入正题吧! 最终效果图 简单做了个页面

【SSO单点系列】(3):CAS4.0 登录页验证码的添加

附上源代码: http://pan.baidu.com/s/1mgDptZa 这一篇主要是讲解怎么在登录页上添加验证码功能,默认的登录页是只有用户名与密码功能.其他我觉得加验证码没什么用,因为现在我部门做的系统主要是放在内网里,外网是不能访问的.登录页的验证码主要是为了防止进账号进行暴力破解,不过我觉得客户估计也不会没事去搞这玩意.以上只是我自己的个人见解,可能有失偏颇,就当作是对客户的愤怒的一种发泄吧,大家看看就好,最近真是被客户搞得头都大了.不过,如果你的系统放在外网上,那验证码是必须要加上

MVC基本登陆与验证码功能实现

一.基本登陆实现与验证码功能实现,该功能是和spring.net功能集合使用的,因为后面要用到验证是否处于登陆状态 1. 先构建一个登陆页面 1 @{ 2 Layout = null; 3 } 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <title>XX商城后台管理系统登录</title> 8 <script type="text/javascript"> 9 if (window

Django之路 - 实现登录随机验证码

登录验证码是每个网站登录时的基本标配,网上也有很多相应的文章, 但是从生成验证码到 应用到自己的网站上的全步骤,并没有看到很多, 为了节约大家的时间,我把整体步骤写下来, 即拿即用哈 1. 生成随机验证码  随机验证码代码 2. 如何应用到你的django项目中 整个验证码的流程如下 用户访问登录页面,你的后台程序在给用户返回登录页面时,同时生成了验证码图片 用户输入账户信息和验证码数字,提交表单 后台判断用户输入的验证码和你生成的图片信息是否一致,如果一致,就代表验证码是没有问题的 问题就卡在