验证码

当登录一个网站的时候往往会有验证码.

python生成随机验证码,需要使用到 PIL 模块

安装 :

pip3 install pillow 

1. 创建图片       

我们现在写的验证码属于简单的图片验证码 .

from PIL import Image,ImageDraw,ImageFont
img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255)) # 在图片查看器中打开
# img.show() # 保存在本地
with open('code.png','wb') as f:
img.save(f,format='png')

2.创建画笔,用于在图片上画内容.

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))

#size 图片的大小
draw = ImageDraw.Draw(img, mode='RGB')

3.画点

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示坐标
# 第二个参数:表示颜色
draw.point([100, 100], fill="red")
draw.point([300, 300], fill=(255, 255, 255))

4.画线

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示起始坐标和结束坐标
# 第二个参数:表示颜色
draw.line((100,100,100,300), fill='red')
draw.line((100,100,300,100), fill=(255, 255, 255)) ##############
width=120
height=30
for i in range(100): #循环100条线
x1=random.randint(0,width)
x2=random.randint(0,width)
y1=random.randint(0,height)
y2=random.randint(0,height)
draw.line((x1,y1,x2,y2),fill=get_random_color())

5.画圆

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示起始坐标和结束坐标(圆要画在其中间)
# 第二个参数:表示开始角度
# 第三个参数:表示结束角度
# 第四个参数:表示颜色
draw.arc((100,100,300,300),0,90,fill="red") ####################
width=120
height=30
for i in range(500):
draw.point([random.randint(0, width), random.randint(0, height)], fill=get_random_color())
x = random.randint(0, width)
y = random.randint(0, height)
draw.arc((x, y, x + 4, y + 4), 0, 90, fill=get_random_color())

6.写本文

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示起始坐标
# 第二个参数:表示写入内容
# 第三个参数:表示颜色
draw.text([0,0],'python',"red")

 7.特殊字体文字

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
# 第一个参数:表示字体文件路径
# 第二个参数:表示字体大小
font = ImageFont.truetype("kumo.ttf", 28)
# 第一个参数:表示起始坐标
# 第二个参数:表示写入内容
# 第三个参数:表示颜色
# 第四个参数:表示颜色
draw.text([0, 0], 'python', "red", font=font)

示例 : 图片验证码 

from PIL import Image,ImageDraw,ImageFont

from io import BytesIO

import random

def get_valid_img(request):

     #创建随机颜色,随机三种颜色混合
def get_random_color():
return (random.randint(0,255),random.randint(0,255),random.randint(0,255))
#创建图片大小和背景颜色
img = Image.new("RGB", (350, 38), get_random_color())
draw = ImageDraw.Draw(img)
#特殊文字和字体大小
font = ImageFont.truetype("static/font/kumo.ttf", 32) keep_str="" #放验证码
for i in range(6): #6位验证码,循环6次
#0~9的随机数字
random_num = str(random.randint(0, 9))
#小写的字母
random_lowalf = chr(random.randint(97, 122))
#大写字母
random_upperalf = chr(random.randint(65, 90))
random_char=random.choice([random_num,random_lowalf,random_upperalf])
#字体在图片的位置
draw.text((i*30+50,0),random_char, get_random_color(), font=font)
keep_str+=random_char
#干扰,防止机器无限制访问
width=350
height=38
#画线
for i in range(100):
x1=random.randint(0,width)
x2=random.randint(0,width)
y1=random.randint(0,height)
y2=random.randint(0,height)
draw.line((x1,y1,x2,y2),fill=get_random_color())
#画圆
for i in range(500):
draw.point([random.randint(0, width), random.randint(0, height)], fill=get_random_color())
x = random.randint(0, width)
y = random.randint(0, height)
draw.arc((x, y, x + 4, y + 4), 0, 90, fill=get_random_color()) # 写与读,内存句柄
f = BytesIO()
img.save(f, "png")
#从内存中读出来
data = f.getvalue() print('keep_str',keep_str) # 将验证码存在各自的session中,这样一个人如果多次验证不成功,下一次的验证码会覆盖上一次的
request.session['keep_str']=keep_str return HttpResponse(data)

注意:字体文件下载 猛击这里

基于ajax的登录

urls.py

from django.contrib import admin
from django.urls import path, re_path from app01 import views urlpatterns = [
path('admin/', admin.site.urls),
path('login/', views.login), #登录
path('get_valid_img/',views.get_valid_img), #验证码
path('zhuce/', views.zhuce), #注册
path('books/', views.book_view), #内容页面 ]

视图 views.py

from django.contrib.auth.models import User

from django.http import JsonResponse

from django.contrib import auth

from django import forms

def login(request):

    if request.is_ajax():
user=request.POST.get("user")
pwd=request.POST.get("pwd")
validcode=request.POST.get("validcode") # 状态码,正确返回{"user":""},错误返回{"err_msg":"错误信息"}
response={"user":None,"err_msg":""}
# 如果验证码相同 将验证码保存到各自的session中,覆盖
if validcode.upper() == request.session.get("keep_str").upper():
# 校验
user_obj=auth.authenticate(username=user,password=pwd)
if user_obj: response["user"]=user
# print("-----------",user) else:
response["err_msg"]="用户名或密码错误"
return JsonResponse(response)
else:
response["err_msg"]="验证码错误" return JsonResponse(response)
# get 请求
else:
return render(request,"login.html")

login.html

<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录页面</title>
<link rel="stylesheet" type="text/css" href="../static/css/styles.css">
<!--[if IE]>
<script src="/static/js/html5shiv.min.js"></script>
<![endif]--> </head>
<body>
<div class="jq22-container" style="padding-top:100px">
<div class="login-wrap">
<div class="login-html">
<input id="tab-1" type="radio" name="tab" class="sign-in" checked><label for="tab-1" class="tab">登录</label>
<div class="login-form">
<form method="post">
<div class="sign-in-htm">
<div class="group">
<label for="user" class="label">用户名</label>
<input id="user" type="text" class="input" placeholder="请在这里输入用户名" name="user">
</div>
<div class="group">
<label for="pass" class="label">密码</label>
<input id="pwd" type="password" class="input" data-type="password" name="pwd" placeholder="请在这里输入密码">
</div>
{# <div class="group">#}
{# <label for="pass" class="label">邮箱</label>#}
{# <input id="email" type="text" class="input" placeholder="请在这里输入邮箱" name="email">#}
{# </div>#}
<div class="group">
<label for="pass">验证码</label>
<div>
<input id="validcode" type="text" class="input">
<span class="error"></span>
</div>
<div>
<img id="img" style="width: 385px;height: 40px;margin-top: 30px" src="/get_valid_img/" alt="">
</div>
</div>
<div class="group">
<input type="button" class="button login_btn" value="登录" style="cursor: pointer">
</div>
<div class="group">
<a href="/zhuce/">
<input type="button" class="button" value="注册" style="cursor: pointer">
</a>
</div>
<div class="hr"></div>
<div class="foot-lnk">
<a href="http://www.baidu.com">忘记密码</a>
</div>
</div>
{% csrf_token %}
</form>
</div>
</div>
</div>
</div>
<script src="/static/js/jquery.js"></script>
<script>
$(".login_btn").click(function () { $.ajax({
url:"",
type:"post",
data:{
user:$("#user").val(),
pwd:$("#pwd").val(),
validcode:$("#validcode").val(),
csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val() },
success:function (response) {
{#alert(response);#} if(response.user){
//登录成功,重定向到
location.href="/books/"
}
else{
{#错误在登录下面显示错误#}
$(".error").html(response.err_msg).css("color","red")
}
}
})
});
//刷新验证码
$("#img").click(function () {
{#局部刷新#}
this.src+="?"
}) </script> </body>
</html>

效果 :

基于ajax的登录的更多相关文章

  1. Django中 基于form的注册,基于ajax的登录

    1 form.py中写register的的form组件 from django import forms class Register(forms.Form): # 注册的form username ...

  2. 基于ajax 的 几个例子 session ,ajax 实现登录,验证码 ,实现ajax表单展示

    headers: {"X-CSRFToken": $("[name='csrfmiddlewaretoken']").val()},data:$(". ...

  3. python 全栈开发,Day75(Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件)

    昨日内容回顾 基于对象的跨表查询 正向查询:关联属性在A表中,所以A对象找关联B表数据,正向查询 反向查询:关联属性在A表中,所以B对象找A对象,反向查询 一对多: 按字段:xx book ----- ...

  4. Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件

    一.Django与Ajax AJAX准备知识:JSON 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻 ...

  5. Django【第22篇】:基于Ajax实现的登录

    基于ajax实现的登录 一.需要知道的新知识点 1.刷新验证码.给src属性加一个?号.加个?会重新去请求 //#给验证码刷新 $(".vialdCode_img").click( ...

  6. [转载:Q1mi]Bootstrap和基于Bootstrap的登录验证示例

    转载自:Q1mi Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支 ...

  7. day059-60 ajax初识 登录认证练习 form装饰器, form和ajax上传文件 contentType

    一.ajax 的特点 1.异步交互:客户端发出一个请求后,需要等待服务器响应结束后, 才能发出第二个请求 2.局部刷新:给用户的感受是在不知不觉中完成请求和响应过程. 二.ajax 模板示例 ($.a ...

  8. 基于ajax提交数据

    昨日回顾: 1 inclusion_tag -干什么用的?生成html的片段(动态,传参数,传数据) -app下新建一个模块,templatetags -创建一个py文件(mytag.py) -fro ...

  9. jQuery实现form表单基于ajax无刷新提交方法详解

    本文实例讲述了jQuery实现form表单基于ajax无刷新提交方法.分享给大家供大家参考,具体如下: 首先,新建Login.html页面: <!DOCTYPE html PUBLIC &quo ...

随机推荐

  1. django admin页面样式丢失问题

    wamp 配置django admin页面样式丢失问题 第一种方法:在apache配置文件httpd.conf中加入如下代码:Alias /static "E:\Python27\Lib\s ...

  2. JAVA使用外部字体将文字生成图片,并使用FontMetrics居中文字

    需求: 1.用户输入文字,根据外部字体,将文字生成图片 2.输出的文字需要居中在图片中显示 遇到的问题: 1.如何导入外部字体?使用Java的Font类,所有的字体都是系统安装过的 2.每次用户输入的 ...

  3. from: Maven实战(九)——打包的技巧

    from : http://www.infoq.com/cn/news/2011/06/xxb-maven-9-package 要点: 1. 打出可执行的jar包, 2. 自定义打包

  4. eclipse离线安装插件过程

    离线安装插件: 1. help -> install New Softe.. 2. 打开安装插件界面 最后点击,next, 同意事项,重启eclipse.

  5. 关于Blind XXE

    关于Blind XXE 关于XXE,很早之前内部做过分享,个人觉得漏洞本身没太多的玩点,比较有意思主要在于:不同语言处理URI的多元化和不同XML解析器在解析XML的一些特性. 在科普Blind XX ...

  6. sql 从另外一张表查询数据存入本表. (有关联的)

    UPDATE friends INNER JOIN users ON friends.friendid=users.userid SET friends.friendname=users.userna ...

  7. java中各种时间格式的转化

    http://www.chinaitpower.com/A/2005-01-14/104881.html 使用java.util.Calendar返回间隔天数         static int g ...

  8. 生成二维码(jquery.qrcode.min.js插件)

    生成二维码:参看GitHub资源https://github.com/jeromeetienne/jquery-qrcode 直接上代码:(都需要引入jQuery.js  1.引入(jquery.qr ...

  9. Docker 三大核心工具

    Docker-machineDocker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox. Digital Oc ...

  10. C​P​U​_​C​S​t​a​t​e​_​P​S​t​a​t​e and then ACPI on Wiki

    http://wenku.baidu.com/link?url=eHbdT4EjdJx3dsQETGUIL8q1K3_EyuzGLWT0G103AEca0vs0gHR_v_3c0oaUL2gbkrr8 ...