前后端不分离
***在图片上写代码,发送到前台,进行验证码 校验
from PIL import Image,ImageDraw,ImageFont
"""
Image 生成图片的
ImageDraw 在图片上写东西的
ImageFont 控制字体样式的
"""
from io import BytesIO,StringIO
"""
io是一个内存管理器模块
BytesIO 能够帮你存储数据 二级制格式
StringIO 能够帮你存储数据 字符串格式
"""
import random
def get_random():
return random.randint(0,255),random.randint(0,255),random.randint(0,255)
def get_code(value):
# 在产生的图片上 写验证码
img_obj = Image.new('RGB', (360,35), get_random())
img_draw = ImageDraw.Draw(img_obj) # 生成一个可以在图片上写字的画笔对象
img_font = ImageFont.truetype('static/font/222.ttf',30) # 字体样式 及 大小
io_obj = BytesIO()
# 图片验证码 一般都是有 数字 大写字母 小写字母
# 五位 每一位都可以 数字或大写字母或小写字母
code = ''
for i in range(5):
upper_str = chr(random.randint(65,90))
low_str = chr(random.randint(97,122))
random_int = str(random.randint(0,9))
# 随机取一个
temp_code = random.choice([upper_str,low_str,random_int])
# 朝图片上写
img_draw.text((70+i*45,0),temp_code,get_random(),font=img_font)
code += temp_code
print(code)
# 将产生的随机验证码 存入session中 以便后续其他视图函数获取 校验验证码
request.session['code'] = code
img_obj.save(io_obj,'png')
return HttpResponse(io_obj.getvalue())

models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class UserInfo(AbstractUser):
phone = models.BigIntegerField(null=True,blank=True) # blank是用来告诉admin后台 该字段可以不填
# avatar存的是用户头像文件路径 用户上传的头像会自动保存到avatar文件夹下
avatar = models.FileField(upload_to='avatar/',default='avatar/default.jpg')
create_time = models.DateField(auto_now_add=True)
blog = models.OneToOneField(to='Blog',null=True)
class Meta:
verbose_name_plural = '用户表'
# verbose_name = '用户表'
def __str__(self):
return self.username
class Blog(models.Model):
site_title = models.CharField(max_length=32)
site_name = models.CharField(max_length=32)
site_theme = models.CharField(max_length=255)
def __str__(self):
return self.site_name
class Category(models.Model):
name = models.CharField(max_length=32)
blog = models.ForeignKey(to='Blog')
def __str__(self):
return self.name
class Tag(models.Model):
name = models.CharField(max_length=32)
blog = models.ForeignKey(to='Blog')
def __str__(self):
return self.name
class Article(models.Model):
title = models.CharField(max_length=255)
desc = models.CharField(max_length=255)
content = models.TextField() # 存大段文本
create_time = models.DateField(auto_now_add=True)
# 数据库优化字段
comment_num = models.IntegerField(default=0)
up_num = models.IntegerField(default=0)
down_num = models.IntegerField(default=0)
# 外键字段
blog = models.ForeignKey(to='Blog',null=True)
category = models.ForeignKey(to='Category',null=True)
tag = models.ManyToManyField(to='Tag',through='Article2Tag',through_fields=('article','tag'))
def __str__(self):
return self.title
class Article2Tag(models.Model):
article = models.ForeignKey(to='Article')
tag = models.ForeignKey(to='Tag')
class UpAndDown(models.Model):
user = models.ForeignKey(to='UserInfo')
article = models.ForeignKey(to='Article')
is_up = models.BooleanField() # 传布尔值 存0/1
class Comment(models.Model):
user = models.ForeignKey(to='UserInfo')
article = models.ForeignKey(to='Article')
content = models.CharField(max_length=255)
create_time = models.DateField(auto_now_add=True)
parent = models.ForeignKey(to='self',null=True)