第九章:验证码生成与文件上传

第一节:前期准备

1、在虚拟环境中创建工程

在这里插入图片描述

2、创建子应用

创建子应用
在这里插入图片描述
注册子应用
在这里插入图片描述

3、分发路由

把主工程路由分发给子应用
在这里插入图片描述
创建子应用的路由文件
在这里插入图片描述
创建子路由的所有需要的路由
在这里插入图片描述

4、创建主页

创建工程的路由函数文件
在这里插入图片描述
创建主页路由
在这里插入图片描述
在工程下定义主页路由函数
在这里插入图片描述
创建并注册templates
在这里插入图片描述
在template下创建一个主页页面文件
在这里插入图片描述
最后运行服务器
在这里插入图片描述
在这里插入图片描述

第二节:验证码的生成(固定版)

了解验证码

在用户登录,注册以及一些敏感操作的时候,我们为了防止服务器被暴力请求,或爬虫爬取,我们可以使用验证码进行过滤,减轻服务器的压力。
验证码需要使用绘图库 Pillow

# 安装绘图工具库pillow
pip3 install Pillow

创建登录页面(实现验证码基础)

1、创建‘register.html’,定义注册单

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户注册</title>
</head>
<body>
    <form method="post" action="{%url 'myapp:register'%}" >
        {% csrf_token %}
        <input type="text" placeholder="请输入用户名" name="uname"><br>
        <input type="password" placeholder="请输入密码" name="upwd"><br>
        <img src="/myapp/getvcode"><br>
        <input type="text" placeholder="请输 验证码" name="vcode"><br>
        <input type="submit" value="注册"><br>
    </form>
</body>
</html>
2、创建数据模型并数据迁移

在这里插入图片描述

# 数据迁移
python manage.py makemigrations
python manage.py migrate
3、定义路由函数

在这里插入图片描述

4、创建图片路由(让图片动态显示)

在这里插入图片描述

4、创建字体文件位置(绘制文件时可用)

在工程下创建fonts文件夹,并把字体文件放入工程,static需要先在settings注册好。
1、准备:在settings注册static
在这里插入图片描述
2.在工程下创建fonts文件夹并复制字体文件
window系统的话,可以在下面路径找,如果想要其他字体,可自行网络下载
在这里插入图片描述
完成:
在这里插入图片描述

5、定义图片的路由函数
# 位置  子应用/views.py
import os
import io
from PIL import ImageDraw
from PIL import ImageFont
from django.http import HttpResponse
from django.shortcuts import render
from PIL import Image
from MidUpVcode.settings import BASE_DIR
# Create your views here.

def register(request):...
...
def fuckoff():...

def getvcode(request):
    # 绘制验证码     
    # 创建画布    
    image = Image.new('RGB', (150, 50), color=(0, 0, 0))
    # 创建画笔     
    draw = ImageDraw.Draw(image)
    # 绘制文字     
    # 指定路径    
    path = os.path.join(BASE_DIR, 'static', 'fonts', 'AdobeHeitiStd-Regular.otf')
    ImageFont.truetype(font=path, size=30)
    draw.text((10, 10), 'fuck', fill=(255, 255, 255), font=None)

    # 返回验证码字节数据     
    # 创建字节容器     
    buff = io.BytesIO()
    # 将画布内容丢入容器    
    image.save(buff, 'png')
    # 返回容器内的字节    
    return HttpResponse(buff.getvalue(), 'image/png')


6、定义注册页的路由函数

在这里插入图片描述
运行服务器测试结果:
在这里插入图片描述

第三节:验证码的生成(完整版)

随机验证码的生成

1、使用随机数完善验证码并储存到session
import os
import io
import random
import string

from PIL import ImageDraw
from PIL import ImageFont
from django.http import HttpResponse
from django.shortcuts import render
from PIL import Image
from MidUpVcode.settings import BASE_DIR
# Create your views here.

def register(request):...
...
...
def getvcode(request):
	###########################生成随机验证码###########################
    # 随机生成验证码(大小写+数字)
    population = string.ascii_letters + string.digits
    #随机取样(取4个)
    letterlist = random.sample(population,4)
    #把4个样本进行拼装,ps:‘.join’是字符串方法
    vcode = ''.join(letterlist)
    #保存该用户的验证码(使用session)
    request.session['vcode'] = vcode
    
	# 注:把下面的“fuck” 改成 vcode

	###########################生成随机验证码###########################
	
    # 绘制验证码     
    # 创建画布    
    image = Image.new('RGB', (150, 50), color=(0, 0, 0))
    # 创建画笔     
    draw = ImageDraw.Draw(image)
    # 绘制文字     
    # 指定路径    
    path = os.path.join(BASE_DIR, 'static', 'fonts', 'AdobeHeitiStd-Regular.otf')
    ImageFont.truetype(font=path, size=30)
    draw.text((10, 10), vcode, fill=(255, 255, 255), font=None)

    # 返回验证码字节数据     
    # 创建字节容器     
    buff = io.BytesIO()
    # 将画布内容丢入容器    
    image.save(buff, 'png')
    # 返回容器内的字节    
    return HttpResponse(buff.getvalue(), 'image/png')
2、注册时校验验证码(获取验证码的session,并忽略大小写)
import os
import io
import random
import string

from PIL import ImageDraw
from PIL import ImageFont
from django.http import HttpResponse
from django.shortcuts import render
from PIL import Image
from MidUpVcode.settings import BASE_DIR
from Myapp.models import Euser
# Create your views here.



def register(request):
    if request.method == 'GET':
        return render(request,'register.html')
    else:
        username = request.POST.get('username',None)
        password = request.POST.get('password',None)
        vcode = request.POST.get('vcode',None)

        ###########################校验验证码###########################
        #获取session中的验证码
        sessVcode = request.session.get('vcode',None)
        if vcode and sessVcode and vcode.lower()==sessVcode.lower():
            user = Euser()
            user.username = username
            user.upsw = password
            user.save()

            return HttpResponse('注册成功')
        else:
            return HttpResponse('注册失败')

运行服务器测试结果:
在这里插入图片描述

点击网页时切换验证码

1、优化验证码颜色、背景、宽高

在这里插入图片描述
运行服务器测试结果:
在这里插入图片描述

2、添加噪声
# 位置:子应用/views.py
import ...

def getvcode(request):
    # 随机生成验证码(大小写+数字)
    population = string.ascii_letters + string.digits
    ... ...
    ... ...
    ... ...
    for i in range(len(vcode)):
        draw.text((20+30*i, 5), vcode[i], fill=getRandomColor(), font=font)
        
	############################# 添加噪声 ###############################
    # 添加噪声(增加500个点)     
    for i in range(500):
        #点的宽高随机         
        position = (random.randint(0,175),random.randint(0,50))
        #画点
        draw.point(position,fill=getRandomColor())
	############################# 添加噪声 ###############################
	
    # 返回验证码字节数据     
    # 创建字节容器     
    buff = io.BytesIO()
    # 将画布内容丢入容器    
    image.save(buff, 'png')
    # 返回容器内的字节    
    return HttpResponse(buff.getvalue(), 'image/png')

#定义随机颜色
def getRandomColor(): ...

在这里插入图片描述

3、添加点击事件

在这里插入图片描述
运行服务器测试结果:
在这里插入图片描述

第四节:文件(头像)上传

HTML添加上传控件

下面以原有注册表单为例,添加表单、上传头像

1、定义上传表单

在这里插入图片描述

2、添加交互方式

在这里插入图片描述

文件配置

1、在static文件夹下创建uploads文件夹

在static文件夹下创建uploadefiles用于存储接收上传的文件,文件夹名字可任取,注册时使用相应名称便可

在这里插入图片描述

2、注册上传位置

在这里插入图片描述

创建数据模型

1、添加头像字段

在这里插入图片描述

2、执行数据迁移
python manage.py makemigrations
python manage.py migrate

定义路由函数(jdango内置储存)

在这里插入图片描述
在这里插入图片描述

第四节:运用中间件设置福利页

第五节:运用中间件设置VIP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值