一.在urls中写路由

二.返回登录页面(login.html中写前端代码) 

- username(用户名)

- password(密码)

- validCode(验证码)

-submit(提交按钮)

-submit
-前端:显示的验证码图片
<div class="col-md-6">
<img class="validCode_img" src="/get_validCode_img/" alt="" width="200px" height="50px">
</div>

  

-后端:
  方式一:以二进制打开一个图片路径,获取内容 返回给前端
import os
path=os.path.join(settings.BASE_DIR,"blog","static","img","egon.jpg") with open(path,"rb",)as f:
data = f.read()

  

方式二:导入Image,还是以二进制打开一个图片路径,获取内容,返回给前端
  from PIL import Image
img=Image.new(mode="RGB",size=(120,40),color="blue") f = open("validCode.png","wb")
img.save(f,"png") with open("validCode.png","rb") as f:
  data = f.read()

  

方式三:
  from io import BytesIO //导入文件句柄的对象和Image   from PIL import Image
  img = Image.new(mode="RGB",size=(120,40),color="yellow") //创建一个img图片的对象
  f=BytesIO() //创建一个内存句柄的对象
  img.save(f,"png")
  data = f.getvalue()

  

方式四: //创建一个img对象,获取一个画笔,创建字体font。定义一个列表,用for循环随机取出数字或者字母
  from io import BytesIO
import random from PIL import Image,ImageDraw,ImageFont
img = Image.new(mode="RGB",size=(120,40),color=(random.randint(0,255),random.randint(0,255),random.randint(0,255))) draw = ImageDraw.Draw(img,"RGB") #获取一个画笔
font = ImageFont.truetype("blog/static/font/kumo.ttf",28) valid_list = []
for i in range(4):
random_num = str(random.randint(0,9))
random_lower_zimu = chr(random.randint(65,90))
random_upper_zimu = chr(random.randint(97,122)) random_char = random.choice([random_num,random_lower_zimu,random_upper_zimu]) draw.text([4+i*24,10],random_char,(random.randint(0,255),random.randint(0,255),random.randint(0,255)),font=font) valid_list.append(random_char) f=BytesIO() //拿到一个句柄对象
img.save(f,"png") //用什么格式保存该图片
data = f.getvalue() valid_str ="".join(valid_list)
print(valid_str) request.session["keepValidCode"]=valid_str
return HttpResponse(data)   def index(request):     return render(request,"index.html")   返回验证码并且把验证码写入session

  三.点击submit提交

  -ajax向后端提交 

    前端:(login.html.)

<script>
$("#subBtn").click(function () {
$.ajax({
url: "/login/",
type: "POST",
data: {
"username": $("#username").val(),
"password": $("#password").val(),
"validCode": $("#validCode").val(),
"csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val(),
},
success: function (data) {
console.log(data); var response = JSON.parse(data);
if (response["is_login"]) {
location.href = "/index/"
}
else {
$(".error").html(response["error_msg"]).css("color", "red")
} }
})
}) </script>

  后端:(在views中:)

-判断是否是ajax请求
  if request.is_ajax():
- 获取用户名 密码 验证码
-username = request.POST.get("username")
-password = reuqest.POST.get("password")
-validCode = request.POST.get("validCode") -判断验证用户信息是否存在
-login_response = {"is_login":False,"error_msg":None} - 前端获取到的验证码和后端session的验证码是否相同
如果相同:
  用户名和密码和数据库中是否匹配
如果不同:
  obj[error_msg] = "username or password error"
返回前端
if validCode.upper() == request.session.get("keepValidCode").upper():
user = auth.authenticate(username=username, password=password) if user:
login_response["is_login"] = True
auth.login(request, user) else:
login_response["error_msg"] = "username or password error" else:
login_response["error_msg"] = "validCode error" import json return HttpResponse(json.dumps(login_response)) return render(request, "login.html")

  

  

  

blogCMS整理的更多相关文章

  1. blogCMS中出现的错误整理

    1.在写日期归档的时候,出现如下错误: not enough values to unpack (expected 2, got 1) 出现这个错误是因为:字符串需要能够split成2份才能赋值给2个 ...

  2. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  3. UWP学习目录整理

    UWP学习目录整理 0x00 可以忽略的废话 10月6号靠着半听半猜和文字直播的补充看完了微软的秋季新品发布会,信仰充值成功,对UWP的开发十分感兴趣,打算后面找时间学习一下.谁想到学习的欲望越来越强 ...

  4. SQL Server 常用内置函数(built-in)持续整理

    本文用于收集在运维中经常使用的系统内置函数,持续整理中 一,常用Metadata函数 1,查看数据库的ID和Name db_id(‘DB Name’),db_name('DB ID') 2,查看对象的 ...

  5. kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  6. JAVA程序员常用软件整理下载

    ********为了大家学习方便,特意整理软件下载如下:*************Java类软件:-------------------------------JDK7.0:http://pan.ba ...

  7. js数组学习整理

    原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...

  8. GJM : C#设计模式汇总整理——导航 【原创】

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  9. 整理下.net分布式系统架构的思路

    最近看到有部分招聘信息,要求应聘者说一下分布式系统架构的思路.今天早晨正好有些时间,我也把我们实际在.net方面网站架构的演化路线整理一下,只是我自己的一些想法,欢迎大家批评指正. 首先说明的是.ne ...

随机推荐

  1. linux应用time和timezone

    linux中应用层(非内核层)time是怎样处理的?时区是怎样设置的?夏令时时是怎样实现的?NTP时间同步是怎么回事?本篇文章就在嵌入式linux应用中time和timezone相关问题总结. 1. ...

  2. 在一个验证form的实例中扩展jQuery.validate

    需求很简单,直接上图: 要验证表单上的3个input输入框的格式,要求如下: 主关键词情形1: 浙江 杭州 温州 主关键词情形2: 浙江|江苏|上海,但是不能用 空格和 | 混合用,也就是情形1和2不 ...

  3. 类加载器与Web容器

    在关于类加载器中已经介绍了Jvm的类加载机制,然而对于运行在Java EE容器中的Web应用来说,类加载器的实现方式与一般的Java应用有所不同.不同的Web容器的实现方式也会有所不同. Tomcat ...

  4. 剖析top命令显示的VIRT RES SHR值

    http://yalung929.blog.163.com/blog/static/203898225201212981731971/ http://www.fuzhijie.me/?p=741 引  ...

  5. 【 D3.js 入门系列 --- 9.4 】 集群图的制作

    本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 集群图( Cluster )通经常使用于表示包括与被包括关系. ...

  6. 卡友友刷MPOS注册开通流程!

    1.下载友刷APP:打开微信扫描机器背面二维码—点击右上角游览器打开 2. 注册-身份证认证-结算卡绑定:用本人手机号注册完成后,顺着进行身份认证.以及储蓄结算卡绑定.具体看下图: 3.绑定机器:选择 ...

  7. Android音频文件浏览+音频播放

    该Demo执行后,会显示全部你sd卡上的音乐文件列表, 并能够点击列表选择某一首歌曲进行播放. 执行效果: 点击download出现: 然后点击歌曲调用系统播放器播放. 源码: activity_au ...

  8. RegDBGetKeyValueEx函数使用报错error 1 numeric value required

    参考:http://evely.blog.51cto.com/1089422/1400965 RegDBGetKeyValueEx函数:  InstallSheild Script Code  123 ...

  9. Docker入门与应用系列(六)Docker私有与公共镜像仓库

    1.搭建私有镜像仓库 Docker Hub作为Docker默认官方公共镜像:如果想搭建自己的私有镜像仓库,官方提供registry镜像,使搭建私有仓库非常简单 1.1下载registry镜像并启动 d ...

  10. eclipse新建maven web工程

    每次建maven项目,总会有问题.决定在这整理一次,避免以后浪费时间. 最后目录为 1.首先修改pom.xml 之前老是出现明明改了 java compiler 已maven update 一下就又变 ...