一、昨日内容回顾

  django认证系统

  

1. 默认auth_user

```
# 创建用户
from django.contrib.auth.models import User
User.objects.create_user()
User.objects.create_superuser(username=,password=...)
# 去数据库校验用户名或密码是否正常,正确返回user对象,错误返回None
user = auth.authticate(username=...,password=...)
# auth.login(request,user)
# 1. 让当前用户登录,给cookie和session写入数据
# 2. 这步操作执行之后,用户的浏览器有了cookie,session表里有了对应数据
# session中根据cookie在session中找到user信息 ———》 user_obj/匿名用户
# request.user = user_obj/匿名用户
# auth.logout(request) # 退出登录删除session中的用户信息,利用request.session.flush()
# user = request.user
user.is_authticated()
# 给登录认证加装饰器
from django.contrib.auth.decorators import login_required
# from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')
user = User.objects.create_superuser()
# user = request.user
user.check_password("旧密码")
user.set_password("新密码")
user.save()
``` 2. 扩展默认auth_user
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
....
....
AUTH_USER_MODEL = "app名.UserInfo"

  

二、今日内容总结

  1、Django ORM的三种模式:

    1)、使用默认的ManyToManyField创建第三张表:

      优势:

        可以使用ORM提供的快捷方法:

        add(),all(),clear(),set(),remove()

      劣势:不能扩展第三张表。  

from django.db import models

# Create your models here.

class Book(models.Model):
title = models.CharField(max_length=32, verbose_name="书名") def __str__(self):
return self.title class Author(models.Model):
name = models.CharField(max_length=32, verbose_name="作者姓名")
books = models.ManyToManyField(to='Book') def __str__(self):
return self.name

    2). 自己创建第三张关系表
      1. 优势:
        1. 可以自己扩展第三章关系表的字段(婚恋网站的男女用户的约会记录)
        2. 劣势:
      1. 不能使用ORM提供的快捷方法

from django.db import models

# Create your models here.

class Book(models.Model):
title = models.CharField(max_length=32, verbose_name="书名") def __str__(self):
return self.title class Author(models.Model):
name = models.CharField(max_length=32, verbose_name="作者姓名") def __str__(self):
return self.name # 自己创建多对多的第三张表
class Author2Book(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author') class Meta:
unique_together = (('book', 'author'), )

    3). 自己创建第三张表,在ManyToManyField中通过through和through_fields指定表名和字段
      1. 优势:
        1. 可以使用ORM提供的部分快捷方法
          1. all()
        2. 可以扩展第三张关系表的字段

from django.db import models

# Create your models here.

class Book(models.Model):
title = models.CharField(max_length=32, verbose_name="书名") def __str__(self):
return self.title class Author(models.Model):
name = models.CharField(max_length=32, verbose_name="作者姓名")
books = models.ManyToManyField(
to='Book',
through='Author2Book',
through_fields=('author', 'book')
) def __str__(self):
return self.name # 自己创建多对多的第三张表
class Author2Book(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author') class Meta:
unique_together = (('book', 'author'), )

  2.bss项目验证码登录

    1. 登录页面实现及验证码布局

    2. 生成验证码图片
      1. pip install pillow
      from PIL import Image, ImageDraw, ImageFont
    3. 如何生成验证码?

    4. 验证码保存在哪里?

    5. 点击刷新验证码如何实现?  

from django.shortcuts import render, HttpResponse
from django.http import JsonResponse
from django import views
from blog.forms import LoginForm
from django.contrib.auth import authenticate, login, logout
# Create your views here. V_CODE = "" # 登录
class Login(views.View): def get(self, request):
form_obj = LoginForm()
return render(request, "login.html", {"form_obj": form_obj}) def post(self, request):
res = {"code": 0}
print(request.POST)
username = request.POST.get('username')
pwd = request.POST.get('password')
v_code = request.POST.get('v_code')
print(v_code)
print(V_CODE)
# 先判断验证码是否正确
if v_code.upper() != request.session.get("v_code", ""):
res["code"] = 1
res["msg"] = "验证码错误"
else:
# 校验用户名密码是否正确
user = authenticate(username=username, password=pwd)
if user:
# 用户名密码正确
login(request, user)
else:
# 用户名或密码错误
res["code"] = 1
res["msg"] = "用户名或密码错误"
return JsonResponse(res) # 首页
class Index(views.View):
def get(self, request):
return render(request, "index.html") # 专门用来返回验证码图片的视图
def v_code(request):
# 随机生成图片
from PIL import Image, ImageDraw, ImageFont
import random
# 生成随机颜色的方法
def random_color():
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
# 生成图片对象
image_obj = Image.new(
"RGB", # 生成图片的模式
(250, 35), # 图片大小
random_color()
)
# 生成一个准备写字的画笔
draw_obj = ImageDraw.Draw(image_obj) # 在哪里写
font_obj = ImageFont.truetype('static/font/kumo.ttf', size=28) # 加载本地的字体文件 # 生成随机验证码
tmp = []
for i in range(5):
n = str(random.randint(0, 9))
l = chr(random.randint(65, 90))
u = chr(random.randint(97, 122))
r = random.choice([n, l, u])
tmp.append(r)
# 每一次取到要写的东西之后,往图片上写
draw_obj.text(
(i*45+25, 0), # 坐标
r, # 内容
fill=random_color(), # 颜色
font=font_obj # 字体
) # # 加干扰线
# width = 250 # 图片宽度(防止越界)
# height = 35
# for i in range(5):
# x1 = random.randint(0, width)
# x2 = random.randint(0, width)
# y1 = random.randint(0, height)
# y2 = random.randint(0, height)
# draw_obj.line((x1, y1, x2, y2), fill=random_color())
#
# # 加干扰点
# for i in range(40):
# draw_obj.point([random.randint(0, width), random.randint(0, height)], fill=random_color())
# x = random.randint(0, width)
# y = random.randint(0, height)
# draw_obj.arc((x, y, x+4, y+4), 0, 90, fill=random_color()) v_code = "".join(tmp) # 得到最终的验证码
# global V_CODE
# V_CODE = v_code # 保存在全局变量不行!!!
# 将该次请求生成的验证码保存在该请求对应的session数据中
request.session['v_code'] = v_code.upper() # 将上一步生成的图片保存在本地的static目录下
# 每一次 都在硬盘中保存再读取都涉及IO操作,会慢
# with open('static/oo.png', 'wb') as f:
# image_obj.save(f)
#
# with open('static/oo.png', "rb") as f:
# data = f.read()
# 直接将生成的图片保存在内存中
from io import BytesIO
f = BytesIO()
image_obj.save(f, "png")
# 从内存读取图片数据
data = f.getvalue()
return HttpResponse(data, content_type="image/png")

验证码校验

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title> <link type="text/css" rel='stylesheet' href="{% static 'bootstrap/dist/css/bootstrap.css' %}">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-4 col-md-offset-4">
<form action="/login/" method="post" class="form-horizontal" id="login_form">
{% csrf_token %}
<div class="form-group">
<label for="{{ form_obj.username.id_for_label }}">{{ form_obj.username.label }}</label>
{{ form_obj.username }}
</div>
<div class="form-group">
<label for="{{ form_obj.password.id_for_label }}">{{ form_obj.password.label }}</label>
{{ form_obj.password }}
</div>
<div class="form-group">
<label for="v_code" style="display: block">验证码</label> <input type="text" id="v_code" class="form-control" style="display: inline-block;width: 180px">
<img src="/v_code/" id='img_check' alt="" width="200px" height="35px" border="black solid 1px"> </div>
<p id="error-p" class="err-text"></p>
<button id="login-btn" type="button" class="btn btn-default">登录</button>
</form>
</div>
</div>
</div>
<script src="{% static 'jquery/jquery.js' %}"></script>
<script>
$('#login-btn').click(function () {
let password = $('#id_password').val();
let username = $('#id_username').val();
let csrf_token = $("[name='csrfmiddlewaretoken']").val();
let v_code = $("#v_code").val()
$.ajax({
url: '/login/',
type: 'post',
data: {
username: username,
password: password,
csrfmiddlewaretoken: csrf_token,
v_code:v_code,
},
success: function (res) {
if(res.code!==0){
$('#error-p').text(res.msg).css("color",'red')
}else {
location.href='/index/'
}
}
})
})
$('input').focus(function () {
$('#error-p').text('');
})
$("#img_check").click(function () {
this.src += '?';
}) </script>
</body>
</html>

login.html

三、预习和扩展

1. 用%s还是format

  https://www.cnblogs.com/liwenzhou/p/8570701.html

python全栈开发day74-普通验证码和滑块验证码的更多相关文章

  1. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  2. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  3. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  4. Python全栈开发【基础四】

    Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...

  5. Python全栈开发【基础三】

    Python全栈开发[基础三]  本节内容: 函数(全局与局部变量) 递归 内置函数 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 def 函数名(参数): ... 函数体 . ...

  6. Python全栈开发【基础二】

    Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...

  7. Python全栈开发【基础一】

    Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与wh ...

  8. python 全栈开发之路 day1

    python 全栈开发之路 day1   本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...

  9. Python全栈开发

    Python全栈开发 一文让你彻底明白Python装饰器原理,从此面试工作再也不怕了. 一.装饰器 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“ ...

  10. 老男孩最新Python全栈开发视频教程(92天全)重点内容梳理笔记 看完就是全栈开发工程师

    为什么要写这个系列博客呢? 说来讽刺,91年生人的我,同龄人大多有一份事业,或者有一个家庭了.而我,念了次985大学,年少轻狂,在大学期间迷信创业,觉得大学里的许多课程如同吃翔一样学了几乎一辈子都用不 ...

随机推荐

  1. openvpn 给客户端固定隧道IP地址

    openvpn 客户端拿到的ip地址是服务器端随机分配的,因此需要远程ssh到一个终端时,它的ip地址有时会变,如何给他固定IP地址呢. 方法如下: 1) 在服务器端使用的配置文件 server.co ...

  2. Linux与Windows串口通信

    串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛.现在国际上不断有串口新技术及新规格推出,结合社会各方面需要,串口通信发展的空间庞大.串口通讯技术因其自身的优势和 ...

  3. hadoop环境配置

    0. Hadoop源码包下载 http://mirror.bit.edu.cn/apache/hadoop/common/   1. 集群环境 Master 172.16.11.97 Slave1 1 ...

  4. hash·余数hash和一致性hash

    网站的伸缩性架构中,分布式的设计是现在的基本应用. 在memcached的分布式架构中,key-value缓存的命中通常采用分布式的算法 一.余数Hash     简单的路由算法可以使用余数Hash: ...

  5. JSP的内置对象及方法

    request表示HttpServletRequest 对象.它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie,header, 和session 数据的有用的方法.response 表 ...

  6. Java编程的分期步骤(一)

    日期:2018.8.12 星期一 博客期:005 不知不觉来到第五期了,先简单说一下Java环境!(虽然Java都自学完了才说....)首先,就是在网站上下载一个java包,之后把它下载到全英文的一个 ...

  7. IO 多路复用

    IO 多路复用 多路复用也是要用单线程来处理客户端并发,与其他模型相比多出了select这个模块. 程序不再直接问操作系统要数据,而是先发起一个select调用,select会阻塞直到其中某个sock ...

  8. CommonJs、AMD、CMD模块化规范

    /** * CommonJS 模块化规范 * CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作 */ /*-------Node.js遵循Commonjs规范----- ...

  9. 一.定时任务详解https://i.cnblogs.com/EditPosts.aspx

    定时任务的详解 h每小时运行  d每天运行 w每周运行 m每个月运行  中毒时查看系统定时任务是否有病毒的脚本. crontab  -l  查看用户的定时任务 crontab -e  进入编辑界面增加 ...

  10. 【python】统一转换日期格式dateutil.parser.parse

    背景: 我有很多很多的日志数据,每个日志里面都有日期字符串,我需要将其转换为datetime格式. 问题是,这些日志里的字符串格式五花八门,有2017-05-25T05:27:30.313292255 ...