Django+Jquery+Ajax+验证码登录案例

1,创建项目test04

这里写图片描述

2,创建应用app为booktest

这里写图片描述

3,注册应用booktest

作用让创建的应用运行起来

4,在项目根目录下创建模板templates目录

  • 作用就是存放html文件

这里写图片描述

  • 在项目的settings.py文件中配置模板,如下图:

这里写图片描述

 

5,在项目根目录下创建static目录

  • 作用就是存放css/图片/js等文件

这里写图片描述

  • 在项目的settings.py文件中配置static文件,如下图

这里写图片描述

6,数据库的创建与配置

这里写图片描述

手动的在mysql数据库中创建test04数据库,如下图

这里写图片描述

7,DEBUG开关设置

这里写图片描述

8,设置编码和时间

LANGUAGE_CODE = 'zh-Hans'TIME_ZONE = 'Asia/Shanghai'

9,项目的urls文件中配置如下:

urlpatterns = [url(r'^admin/', include(admin.site.urls)),url(r'^',include('booktest.urls'))
]

10,在booktest应用下创建urls目录并配置

from django.conf.urls import url
from  booktest import viewsurlpatterns = [# 登录成功urlurl(r'^success/$', views.success),# ajax登录urlurl(r'^login_ajax/$', views.login_ajax),# ajax登录校验urlurl(r'^login_ajax_check/$', views.login_ajax_check),# 生产验证码图片urlurl(r'^verify_code/$', views.verify_code),# 发帖页面urlurl(r'^post_article/$', views.post_article), 
]
--------------------- 
作者:ITxiaoke 
来源:CSDN 
原文:https://blog.csdn.net/u014745194/article/details/73997737?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

11,在booktest应用views中创建各个视图函数

from django.shortcuts import render
from django.http import JsonResponse
# PIL是python2版本的图像处理库,不过现在用Pillow比PIL强大,是python3的处理库
from PIL import Image, ImageDraw, ImageFont
from django.http import HttpResponse
from django.shortcuts import render, redirect
import random
# 在python2.x中导入模块方法:
# from StringIO import String
# 在python2.x中它还有个孪生兄弟,运行速度比它快,用c实现的
# from cStringIO import StringIO# 在python3.x中,StringIO已经在io模块中了,导入方法
from io import BytesIO# ajax登录视图函数
def login_ajax(request):return render(request, 'booktest/login_ajax.html')# ajax登录校验回调视图函数
def login_ajax_check(request):# 1,获取用户输入的用户名和密码uname = request.POST.get('uname')password = request.POST.get('password')# 获取用户输入的验证码vcode = request.POST.get('vcode')# 获取session中的验证码vcode_session = request.session.get('verifycode')# 2,用户名和密码校验if uname == 'xiaoke' and password == '123456' and vcode == vcode_session:# 保存用户的登录状态request.session['isLogin']=Truerequest.session['uname']=unamerequest.session['password']=passwordreturn JsonResponse({'msg': 'ok'})elif uname != 'xiaoke' or password != '123456':return JsonResponse({'msg': 'fail_user'})elif vcode != vcode_session:return JsonResponse({'msg': 'fail_verify'})def verify_code(request):# 1,定义变量,用于画面的背景色、宽、高# random.randrange(20, 100)意思是在20到100之间随机找一个数bgcolor = (random.randrange(20, 100), random.randrange(20, 100), 255)width = 100height = 25# 2,创建画面对象im = Image.new('RGB', (width, height), bgcolor)# 3,创建画笔对象draw = ImageDraw.Draw(im)# 4,调用画笔的point()函数绘制噪点,防止攻击for i in range(0, 100):# 噪点绘制的范围xy = (random.randrange(0, width), random.randrange(0, height))# 噪点的随机颜色fill = (random.randrange(0, 255), 255, random.randrange(0, 255))# 绘制出噪点draw.point(xy, fill=fill)# 5,定义验证码的备选值str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'# 6,随机选取4个值作为验证码rand_str = ''for i in range(0, 4):rand_str += str1[random.randrange(0, len(str1))]# 7,构造字体对象,ubuntu的字体路径为“/usr/share/fonts/truetype/freefont”font = ImageFont.truetype('FreeMono.ttf', 23)# 8,构造字体颜色fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))# 9,绘制4个字draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)# 9,用完画笔,释放画笔del draw# 10,存入session,用于做进一步验证request.session['verifycode'] = rand_str# 11,内存文件操作buf = BytesIO()# 12,将图片保存在内存中,文件类型为pngim.save(buf, 'png')# 13,将内存中的图片数据返回给客户端,MIME类型为图片pngreturn HttpResponse(buf.getvalue(), 'image/png')# ajax登录成功视图函数
def success(request):# 用户已经登录if request.session.get('isLogin'):return render(request, 'booktest/success.html')else:return redirect('/login_ajax/')# 发帖操作视图函数
def post_article(request):# 获取登录的用户名uname = request.session.get('uname')# 获取帖子的标题title = request.POST.get('title')content = request.POST.get('content')return HttpResponse('%s发了一篇名为%s的帖子:%s' % (uname.encode('utf-8').decode('utf-8'),title.encode('utf-8').decode('utf-8'),content.encode('utf-8').decode('utf-8')))
--------------------- 
作者:ITxiaoke 
来源:CSDN 
原文:https://blog.csdn.net/u014745194/article/details/73997737?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

12,ajax登录页面布局代码如下:

以下是csrf攻击的原理图:

这里写图片描述

csrf_token 的目地是为了防止csrf公积,django默认打开csrf:如下代码
‘django.middleware.csrf.CsrfViewMiddleware’,
查看网页源代码可知,csrf的键和值,所以请求的时候要携带,否则django直接禁止:
这里写图片描述

 ajax登录页面具体布局如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录页面</title><script src="/static/js/jquery-1.12.4.min.js"></script><style>#errorMsg {display: none;color: red;}</style><script>$(function () {$('#btnLogin').click(function () {$('uname').reset;csrf = $('input').val();uname = $('#uname').val();password = $('#password').val();vcode = $('#vcode').val();//发起ajax请求,注意csrf攻击$.post('/login_ajax_check/', {'csrfmiddlewaretoken': csrf,'uname': uname,'password': password,'vcode': vcode,}, function (data) {//获取返回的数据并进行操作if (data.msg === 'ok') {//登录成功location.href = '/success/' //跳转到成功页面} else if (data.msg === 'fail_user') {$('#errorMsg').show().text('亲!用户名或密码错误!')} else if (data.msg === 'fail_verify') {//验证码错误$('#errorMsg').show().text('亲!验证码错误!')}})});});</script>
</head><body><div>{% csrf_token %}用户名:<input type="text" id="uname"><br/>密&nbsp;&nbsp;码:<input type="password" id="password"><br/>验证码:<input type="text" id="vcode"/><br/><!--直接调用生产图片验证码的视图函数,生产验证码--><img src="/verify_code/" id="imgvcode"/><br/><input type="button" value="登录" id="btnLogin"><br/><div id="errorMsg"></div>
</div></body>
</html>
--------------------- 
作者:ITxiaoke 
来源:CSDN 
原文:https://blog.csdn.net/u014745194/article/details/73997737?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

13,登录成功页面,进行发帖布局代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录成功,发帖页面</title>
</head>
<body><h2>亲!你登录成功了,欢迎你!!!</h2>
<form method="post" action="/post_article/">{% csrf_token %}标题:<input type="text" name="title"/><br/>内容:<textarea name="content"></textarea><br/><input type="submit" value="发帖"/>
</form>
</body>
</html>
--------------------- 
作者:ITxiaoke 
来源:CSDN 
原文:https://blog.csdn.net/u014745194/article/details/73997737?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

14,执行迁移,生成session表

 

  • session表示需要执行迁移后,才会在mysql数据库中生成
  • 这里写图片描述

15,查看mysql数据库

 这里写图片描述

 

  • show tables;查看数据库test04中的表
  • django_session就是session表
  • 这里写图片描述

16,开始登录测试

这是登录成功后的页面,进行发帖

这里写图片描述 

这是发帖页面

这里写图片描述 

 

  • 输入用户名、密码和验证码
  • 这里写图片描述

17,查看数据库中session表

这里写图片描述 查看Cookie中的sessionid值为“hzlqkmdkn6461kfwfm2oj7p5889o2fo1”,数据表中session的键为“hzlqkmdkn6461kfwfm2oj7p5889o2fo1”,是一样的,这样,服务器就可以在众多的请求者中找到对应的Session数据。
这里写图片描述

转载自https://blog.csdn.net/u014745194/article/details/73997737 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库】Mysql日期/时间函数实际案例

有一款金融产品&#xff0c;总共24期&#xff0c;每月2日到期还款日&#xff0c;第一个到期还款日为放款日下个月的2日&#xff0c;现在我们知道所有订单的放款时间&#xff0c;现在我们想统计每个订单当前时间是第几期。 举个简单例子&#xff1a;当期日期为2019-11-12&#…

【Jmeter篇】1小时轻松搞定项目接口自动化测试与数据驱动

之前我们的用例数据都是配置在 Jmeter Http 请求中&#xff0c;每次需要增加&#xff0c;修改用例都需要打开 jmeter 重新编辑&#xff0c;当用例越来越多的时候&#xff0c;用例维护起来就越来越麻烦&#xff0c;有没有好的方法来解决这种情况呢&#xff1f; 其实我们可以将用…

module 'queue' has no attribute 'Queue'解决

import queue q queue.Queue() q.put(a) q.put(b) print(q.get())错误&#xff1a; AttributeError: module queue has no attribute Queue 解决方法&#xff1a; 把程序名命名和包名一样导致错误。命名为queue1.py就ok了

【Python】import自己的模块报错

在实际使用python时&#xff0c;我们会将一些公共的东西写到一些基础模块中&#xff0c;供其他模块去调用&#xff0c;这时会去import自定义的一些基础模块&#xff0c;然后来导入。 自己写好了脚本&#xff0c;然后导入&#xff0c;导入的情况分为以下情况&#xff1a; 1. 运行…

Jmeter生成自动化和性能多维度测试报告(性能指标和监听器图表)

jmeter在命令行下还可以生成多维度的测试报告&#xff0c;里面包含了常用的性能指标和监听器图表。 一、环境要求 1、jmeter3.0版本之后开始支持动态生成测试报表 2、jdk版本1.7以上 3、需要jmx脚本文件 二、生成jtl文件 1、进入bin目录下cd jmeter -n -t C:\jmeter\apach…

python3判断字典、列表、元组为空以及字典是否存在某个key的方法

m1[] m2{} m3() m4{"name":1,"age":2} #也可用if not m1:print("m1不是列表") if m1:print("m1不是列表") else:print(m1)print("m1是空列表")if m2:print("m2不是字典") else:print("m2是空字典") if …

【Python】pyinstaller模块打包的exe在windows环境无法使用问题汇总

问题一&#xff1a;解决pyinstaller打包发布后的exe文件打开控制台闪退的问题 pyinstaller打包发布后的exe文件在自己电脑能够正常使用&#xff0c;但是给到别人的电脑时&#xff0c;打开exe文件却发生闪退&#xff0c;看不到具体的原因。 1、定位问题&#xff1a; 1.1.切换到…

Appium+PythonUI自动化测试之uiautomatorviewer和Inspector元素定位

一、uiautomatorviewer uiautomatorviewer是android-sdk自带的一个元素定位工具&#xff0c;非常简单好用&#xff0c;使用uiautomatorviewer&#xff0c;你可以检查一个应用的UI来查看应用的布局和组件以及相关的属性。 1、启动uiautomatorviewer.bat&#xff0c;打开sdk安装…

服务器购买和远程连接

1. 申请阿里云服务器 *打开阿里云ECS购买页面&#xff0c;并用淘宝账号登陆&#xff0c;可以按需购买。基础配置的话包月大约60元/月 在部署阶段也可以选择按使用流量付费&#xff0c;只需要32元/月&#xff0c;后续部署成功后进行配置升级 操作系统选择Ubuntu的最新版本 …

【批处理】通过bat文件执行python程序

有时我们写的一些python程序&#xff0c;由于每天都经常使用&#xff0c;因此不希望每次都打开IDE客户端或者cmd命令去执行&#xff0c;我们可以写一些bat脚本&#xff0c;每次需要执行时&#xff0c;双击一下脚本就可以了。下面介绍一下三种方法&#xff1a; 1. 简单方法&…

Ubuntu安装包时报错 E:Unable to locate package xxx(如:python3-pip)

一般进入Ubuntu后需要先更新软件源&#xff1a; apt-get update 就ok了 参考自&#xff1a;https://blog.csdn.net/BobYuan888/article/details/80874075

Python一行代码给儿子制作九九乘法表

一行代码实现九九乘法表print(\n.join( .join([%sX%s%s%(j,i,i*j) for j in range(1,i1)]) for i in range(1,10)))1X11 1X22 2X24 1X33 2X36 3X39 1X44 2X48 3X412 4X416 1X55 2X510 3X515 4X520 5X525 1X66 2X612 3X618 4X624 5X630 6X636 1X77 2X714 3X721 4X728 5X735 6X74…

【Linux】与用户管理相关的命令总结

这篇文章主要总结一下linux中用户相关的命令&#xff1a; 一、查询用户信息相关&#xff1a; 二、用户创建、删除相关&#xff1a; 三、用户密码相关 四、用户组相关 一、查询用户信息相关&#xff1a; 1. cat /etc/passwd 可以查看所有用户的列表 具体内容介绍 :分隔成7个…

Xshell连接阿里云服务器ECS

1. 参考资料&#xff1a; 1). 《阿里云服务器怎么用&#xff1f;阿里云服务器使用教程》 链接&#xff1a;http://www.cr173.com/html/50758_1.html 2). eagle-zhang的CSDN博客《Xshell连接不上阿里云服务 链接&#xff1a;http://blog.csdn.net/zhangxing52077/…

【数据库】Windows安装redis全流程

Redis&#xff1a;REmote DIctionary Server(远程字典服务)&#xff0c;是由意大利人Salvatore Sanfilippo&#xff08;网名&#xff1a;antirez&#xff09;开发的一款内存高速缓存数据库。 是完全开源免费的&#xff0c;用C语言编写的&#xff0c;遵守BSD协议&#xff0c;高性…

Jmeter跨线程组传递参数

jmeter的线程组之间是相互独立的&#xff0c;各个线程组互不影响&#xff0c;所以线程组A中输出的参数&#xff0c;是无法直接在线程组B和线程组C中被调用的。 但是有时为了方便管理&#xff0c;我们可能是把各个接口单独存放在不同的线程组中。拿token来说&#xff0c;虽然每…

yum 不能安装应用,提示There are no enabled repos Run yum repolist all

一般来说著名的linux系统基本上分两大类&#xff1a; 1 RedHat系列&#xff1a;Redhat、Centos、Fedora等 2 Debian系列&#xff1a;Debian、Ubuntu等 RedHat 系列&#xff1a; 1 常见的安装包格式 rpm 包&#xff0c;安装rpm包的命令是 “rpm -参数” 2 包管理工具 yum 3 支持…

【工具】Notepad++的一些常用配置

Notepad是d Winows操作系统下的一套文本编辑器(软件版权许可证: GPL)&#xff0c;有完整的中文化接口及支持多国语言编写的功能(UTF8技术)。 本文主要介绍了Notepad的一些常用配置。 一、设置默认打开txt、java文件 菜单&#xff1a;设置—>首选项—>文件关联 设置后&a…

Python类变量和实例变量区别

类变量&#xff1a;定义在类里面&#xff0c;通过类名或对象名引用&#xff0c;如果是通过对象名引用&#xff0c;会先找有没有这个同名的实例变量&#xff0c;如果没有&#xff0c;引用到的才是类变量&#xff0c;类变量的更新&#xff0c;只能通过类名&#xff0c;形如 类名.…

Python类的构造方法__init__(self)和析构函数__del__详解

一、构造方法__init__(self) __init__()方法是一种特殊的方法&#xff0c;被称为类的构造函数或初始化方法&#xff0c;当创建了这个类的实例时就会调用该方法。一般用来对实例的属性进行初使化&#xff0c;如果不提供&#xff0c;Python 会给出默认的__init__方法。 class t…