基于ajax的登录
验证码
当登录一个网站的时候往往会有验证码.
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的登录的更多相关文章
- Django中 基于form的注册,基于ajax的登录
1 form.py中写register的的form组件 from django import forms class Register(forms.Form): # 注册的form username ...
- 基于ajax 的 几个例子 session ,ajax 实现登录,验证码 ,实现ajax表单展示
headers: {"X-CSRFToken": $("[name='csrfmiddlewaretoken']").val()},data:$(". ...
- python 全栈开发,Day75(Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件)
昨日内容回顾 基于对象的跨表查询 正向查询:关联属性在A表中,所以A对象找关联B表数据,正向查询 反向查询:关联属性在A表中,所以B对象找A对象,反向查询 一对多: 按字段:xx book ----- ...
- Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件
一.Django与Ajax AJAX准备知识:JSON 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻 ...
- Django【第22篇】:基于Ajax实现的登录
基于ajax实现的登录 一.需要知道的新知识点 1.刷新验证码.给src属性加一个?号.加个?会重新去请求 //#给验证码刷新 $(".vialdCode_img").click( ...
- [转载:Q1mi]Bootstrap和基于Bootstrap的登录验证示例
转载自:Q1mi Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支 ...
- day059-60 ajax初识 登录认证练习 form装饰器, form和ajax上传文件 contentType
一.ajax 的特点 1.异步交互:客户端发出一个请求后,需要等待服务器响应结束后, 才能发出第二个请求 2.局部刷新:给用户的感受是在不知不觉中完成请求和响应过程. 二.ajax 模板示例 ($.a ...
- 基于ajax提交数据
昨日回顾: 1 inclusion_tag -干什么用的?生成html的片段(动态,传参数,传数据) -app下新建一个模块,templatetags -创建一个py文件(mytag.py) -fro ...
- jQuery实现form表单基于ajax无刷新提交方法详解
本文实例讲述了jQuery实现form表单基于ajax无刷新提交方法.分享给大家供大家参考,具体如下: 首先,新建Login.html页面: <!DOCTYPE html PUBLIC &quo ...
随机推荐
- selinue引起的ssh连接错误
在客户端执行ssh依然报错: Permission denied (publickey,gssapi-keyex,gssapi-with-mic). 在这个页面不小心看到了原因: http://ser ...
- dedecms安装完成后登录后台出现空白
今天家里的电脑上新装DEDE5.7后台登陆后竟然一片空白经过分析代码,发现登录验证的时候用到了这个函数session_register(我的环境:win7+PHP5.4.3+Apache2.2.22+ ...
- pair类型
pair是一个模板数据类型,其中包含两个数据值,两个数据值可以不同 如 pair<int,string>a(2,"fgh");则a是一个pair类型,它包括两个数据,第 ...
- Web自动化测试框架改进
Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 一.适用范围:传统Web功能自动化测试.H5功能自动化测试 ...
- PHP执行linux系统命令
本文是第一篇,讲述如何在PHP中执行系统命令从而实现一些特殊的目的,比如监控服务器负载,重启MySQL.更新SVN.重启Apache等.第二篇<PHP监控linux服务器负载>:http: ...
- JVM的GC简介和实例
本文是一次内部分享中总结了jvm gc的分类和一些实例, 内容是introduction级别的,供初学人士参考.成文仓促,难免有些错误,如果有大牛发现,请留言,我一定及时更正,谢谢!JVM内存布局主要 ...
- HDOJ 2829 Lawrence
四边形不等式优化DP Lawrence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- vs2010+qt4编译出现error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject等错误
1.当vs2010编译qt时会出现以下错误: 1>------ 已启动全部重新生成: 项目: MyDialog, 配置: Debug Win32 ------ 1>生 ...
- NGINX下如何自定义404页面
什么是404页面 如果碰巧网站出了问题,或者用户试图访问一个并不存在的页面时,此时服务器会返回代码为404的错误信息,此时对应页面就是404页面.404页面的默认内容和具体的服务器有关.如果后台用的是 ...
- ROR部署到Heroku出现Application Error和code=H10 desc="App crashed“问题
1.问题发现之前的准备 在读<Learn Python In Hard Way>的时候,发现作者谈到一个非常有趣的事情,在做一些有趣的事情之前做的无聊的事情叫做yak shaving,牦牛 ...