视频加载失败

公共功能

2230 字
11 分钟
公共功能

【一】响应对象#

  • lib/CommonResponse.py
from django.http import JsonResponse
def CommonResponse(code=200, message="请求成功!", **kwargs):
"""
封装一个通用的响应函数
:param code: 响应码
:param message: 响应消息
:param kwargs: 可变长关键字参数
:return: JsonResponse
"""
data = {'code': code, 'message': message}
if kwargs:
data.update(kwargs)
return JsonResponse(data)

【二】分页器#

【1】封账分页器功能#

class Pagination(object):
def __init__(self, current_page, all_count, per_page_num=2, pager_count=11):
"""
封装分页相关数据
:param current_page: 当前页
:param all_count: 数据库中的数据总条数
:param per_page_num: 每页显示的数据条数
:param pager_count: 最多显示的页码个数
"""
try:
current_page = int(current_page)
except Exception as e:
current_page = 1
if current_page < 1:
current_page = 1
self.current_page = current_page
self.all_count = all_count
self.per_page_num = per_page_num
# 总页码
all_pager, tmp = divmod(all_count, per_page_num)
if tmp:
all_pager += 1
self.all_pager = all_pager
self.pager_count = pager_count
self.pager_count_half = int((pager_count - 1) / 2)
@property
def start(self):
return (self.current_page - 1) * self.per_page_num
@property
def end(self):
return self.current_page * self.per_page_num
def page_html(self):
# 如果总页码 < 11个:
if self.all_pager <= self.pager_count:
pager_start = 1
pager_end = self.all_pager + 1
# 总页码 > 11
else:
# 当前页如果<=页面上最多显示11/2个页码
if self.current_page <= self.pager_count_half:
pager_start = 1
pager_end = self.pager_count + 1
# 当前页大于5
else:
# 页码翻到最后
if (self.current_page + self.pager_count_half) > self.all_pager:
pager_end = self.all_pager + 1
pager_start = self.all_pager - self.pager_count + 1
else:
pager_start = self.current_page - self.pager_count_half
pager_end = self.current_page + self.pager_count_half + 1
page_html_list = []
# 添加前面的nav和ul标签
page_html_list.append('''
<nav aria-label='Page navigation>'
<ul class='pagination'>
''')
first_page = '<li><a href="?page=%s">首页</a></li>' % (1)
page_html_list.append(first_page)
if self.current_page <= 1:
prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
else:
prev_page = '<li><a href="?page=%s">上一页</a></li>' % (self.current_page - 1,)
page_html_list.append(prev_page)
for i in range(pager_start, pager_end):
if i == self.current_page:
temp = '<li class="active"><a href="?page=%s">%s</a></li>' % (i, i,)
else:
temp = '<li><a href="?page=%s">%s</a></li>' % (i, i,)
page_html_list.append(temp)
if self.current_page >= self.all_pager:
next_page = '<li class="disabled"><a href="#">下一页</a></li>'
else:
next_page = '<li><a href="?page=%s">下一页</a></li>' % (self.current_page + 1,)
page_html_list.append(next_page)
last_page = '<li><a href="?page=%s">尾页</a></li>' % (self.all_pager,)
page_html_list.append(last_page)
# 尾部添加标签
page_html_list.append('''
</nav>
</ul>
''')
return ''.join(page_html_list)

【2】前端#

<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
{% for book in page_queryset %}
<p>{{ book.title }}</p>
{% endfor %}
{{ page_obj.page_html|safe }}
</div>
</div>
</div>

【3】后端#

def get_book(request):
book_list = models.Book.objects.all()
current_page = request.GET.get("page",1)
all_count = book_list.count()
page_obj = Pagination(current_page=current_page,all_count=all_count,per_page_num=10)
page_queryset = book_list[page_obj.start:page_obj.end]
return render(request,'booklist.html',locals())

【三】图片验证码生成#

【1】推导步骤#

  • 推导一:直接读取本地的图片二进制数据
# 测试前端 img 标签是否能获取后端的图片文件数据
def get_verify_img(request):
# 获取到图片文件所在的绝对路径
img_path = os.path.join(settings.BASE_DIR, "static/avatar/default.png")
# 将图片文件打开并将二进制数据读取
with open(img_path, "rb") as fp:
img_data = fp.read()
# 通过 HttpResponse 返回图片二进制数据
return HttpResponse(img_data)
  • 推导二:利用图片模块生成验证码图片(固定背景色)
# 【1】导入图片处理库 pip install Pillow
from PIL import Image, ImageDraw, ImageFont
# (1)Image 生成图片
# (2)ImageDraw 能够在图片上乱涂乱画
# (3)ImageFont 控制字体样式
def get_verify_img(request):
# 定义图片类型
img_type = "RGB"
# 定义图片大小
img_size = (310, 38)
# 定义图片背景颜色 -- 按照颜色定义
img_rgb_number = "yellow"
# 利用 Image 对象定义一个图片文件参数
img_obj = Image.new(img_type, img_size, img_rgb_number)
# 定义图片文件位置
img_file_path = os.path.join(settings.BASE_DIR, "static", "img", "verify_img")
os.makedirs(img_file_path, exist_ok=True)
img_path = os.path.join(img_file_path, "code.png")
# 打开本地文件写入图片文件
with open(img_path, 'wb') as fp:
img_obj.save(fp, "png")
# 打开本地文件,读取文件数据并渲染给前端
with open(img_path, "rb") as fp:
img_data = fp.read()
return HttpResponse(img_data)
  • 推导三:利用图片模块生成验证码图片(随机rgb背景色)
# 【1】导入图片处理库 pip install Pillow
from PIL import Image, ImageDraw, ImageFont
# (1)Image 生成图片
# (2)ImageDraw 能够在图片上乱涂乱画
# (3)ImageFont 控制字体样式
# 创建RGB随机三元色色值
def rgb_number():
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
def get_verify_img(request):
# 定义图片类型
img_type = "RGB"
# 定义图片大小
img_size = (310, 38)
# 定义图片背景颜色 -- 按照颜色定义
# img_rgb_number = "yellow"
img_rgb_number = rgb_number()
# 利用 Image 对象定义一个图片文件参数
img_obj = Image.new(img_type, img_size, img_rgb_number)
# 定义图片文件位置
img_file_path = os.path.join(settings.BASE_DIR, "static", "img", "verify_img")
os.makedirs(img_file_path, exist_ok=True)
img_path = os.path.join(img_file_path, "code.png")
# 打开本地文件写入图片文件
with open(img_path, 'wb') as fp:
img_obj.save(fp, "png")
# 打开本地文件,读取文件数据并渲染给前端
with open(img_path, "rb") as fp:
img_data = fp.read()
return HttpResponse(img_data)
  • 推导四:利用io内存管理模块存储和读取文件数据
# 【1】导入图片处理库 pip install Pillow
from PIL import Image, ImageDraw, ImageFont
# (1)Image 生成图片
# (2)ImageDraw 能够在图片上乱涂乱画
# (3)ImageFont 控制字体样式
# 【2】导入随机模块
import random
# 【3】导入内存管理模块
from io import BytesIO, StringIO
# (1)BytesIO 临时存储数据,返回的数据是二进制数据
# (2)StringIO 临时存储数据,返回的数据是字符串数据
# 创建RGB随机三元色色值
def rgb_number():
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
def get_verify_img(request):
# 定义图片类型
img_type = "RGB"
# 定义图片大小
img_size = (310, 38)
# 定义图片背景颜色 -- 按照颜色定义
# img_rgb_number = "yellow"
img_rgb_number = rgb_number()
# 利用 Image 对象定义一个图片文件参数
img_obj = Image.new(img_type, img_size, img_rgb_number)
# 生成 IO 对象 操作字节流数据
io_obj = BytesIO()
# 利用 Image 对象保存图片数据成指定格式
img_obj.save(io_obj, "png")
# 利用 IO 对象读取保存的图片字节数据
img_data = io_obj.getvalue()
return HttpResponse(img_data)
  • 推导五:向底色图片中添加验证码
# 【1】导入图片处理库 pip install Pillow
from PIL import Image, ImageDraw, ImageFont
# (1)Image 生成图片
# (2)ImageDraw 能够在图片上乱涂乱画
# (3)ImageFont 控制字体样式
# 【2】导入随机模块
import random
# 【3】导入内存管理模块
from io import BytesIO, StringIO
# (1)BytesIO 临时存储数据,返回的数据是二进制数据
# (2)StringIO 临时存储数据,返回的数据是字符串数据
# 创建RGB随机三元色色值
def rgb_number():
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
def get_verify_img(request):
# 定义图片类型
img_type = "RGB"
# 定义图片大小
img_size = (310, 38)
# 定义图片背景颜色 -- 按照颜色定义
# img_rgb_number = "yellow"
img_rgb_number = rgb_number()
# 利用 Image 对象定义一个图片文件参数
img_obj = Image.new(img_type, img_size, img_rgb_number)
# 利用 ImageDraw 对象产生一个画笔对象
img_draw = ImageDraw.Draw(img_obj)
# 利用 ImageFont 对象定义验证码字体参数(字体样式,字体大小)
img_font = ImageFont.truetype('static/font/汉仪秀英体简.ttf', 30)
# 创建随机验证码(数字 + 字母)
code = ''
for i in range(5):
# 0-9之间的整数
random_int = str(random.randint(0, 9))
# A-Z之间的字母
random_upper = chr(random.randint(65, 90))
# a-z之间的字母
random_lower = chr(random.randint(97, 122))
temp = random.choice([random_int, random_upper, random_lower])
# 这里不使用一次生成五个字符的原因是:一个个写能够控制每个字体的间隙,生成多个一起写没办法控制间隙
# 借助画笔对象依次写入图片数据((x偏移值,y偏移值),写入内容,字体颜色,字体样式)
img_draw.text((i * 60 + 20, 4), temp, rgb_number(), img_font)
# 拼接随机字符串
code += temp
# 生成 IO 对象 操作字节流数据
io_obj = BytesIO()
# 利用 Image 对象保存图片数据成指定格式
img_obj.save(io_obj, "png")
# 利用 IO 对象读取保存的图片字节数据
img_data = io_obj.getvalue()
return HttpResponse(img_data)

【2】方法总结#

########## 模块准备
# 【1】导入图片处理库 pip install Pillow
from PIL import Image, ImageDraw, ImageFont
# (1)Image 生成图片
# (2)ImageDraw 能够在图片上乱涂乱画
# (3)ImageFont 控制字体样式
# 【2】导入随机模块
import random
# 【3】导入内存管理模块
from io import BytesIO, StringIO
# (1)BytesIO 临时存储数据,返回的数据是二进制数据
# (2)StringIO 临时存储数据,返回的数据是字符串数据
# 创建RGB随机三元色色值
def rgb_number():
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
# 创建图片验证码
def create_verify_code(img_type="RGB", img_size=(310, 38), img_rgb_number=rgb_number()):
# 利用 Image 对象定义一个图片文件参数
img_obj = Image.new(img_type, img_size, img_rgb_number)
# 利用 ImageDraw 对象产生一个画笔对象
img_draw = ImageDraw.Draw(img_obj)
# 利用 ImageFont 对象定义验证码字体参数(字体样式,字体大小)
img_font = ImageFont.truetype('static/font/汉仪秀英体简.ttf', 30)
# 创建随机验证码(数字 + 字母)
code = ''
for i in range(5):
# 0-9之间的整数
random_int = str(random.randint(0, 9))
# A-Z之间的字母
random_upper = chr(random.randint(65, 90))
# a-z之间的字母
random_lower = chr(random.randint(97, 122))
temp = random.choice([random_int, random_upper, random_lower])
# 这里不使用一次生成五个字符的原因是:一个个写能够控制每个字体的间隙,生成多个一起写没办法控制间隙
# 借助画笔对象依次写入图片数据((x偏移值,y偏移值),写入内容,字体颜色,字体样式)
img_draw.text((i * 60 + 20, 4), temp, rgb_number(), img_font)
# 拼接随机字符串
code += temp
# 随机验证码在登录的视图函数中需要比对,所以需要找地方存起来,便于其他函数调用
# 生成 IO 对象 操作字节流数据
io_obj = BytesIO()
# 利用 Image 对象保存图片数据成指定格式
img_obj.save(io_obj, "png")
# 利用 IO 对象读取保存的图片字节数据
img_data = io_obj.getvalue()
# 返回生成的随机验证码和验证码的图片二进制数据
return code, img_data

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Profile Image of the Author
Dream
Hello, I'm Dream.
公告
欢迎来到我的博客!爱学习爱进步。
分类
标签
最新动态
站点统计
文章
169
分类
3
标签
26
总字数
334,507
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录