二.Django项目之电商购物商城 -- 校验用户输入密码是否合法

news2025/1/10 15:18:12

Django项目之电商购物商城 – 校验用户输入密码是否合法

需要开发文档和前端资料的可私聊

一. 创建用户逻辑操作

1. 创建用户app – users

python manage.py startapp users

2.注册app

'users.apps.UsersConfig',

3. 创建视图

from django.shortcuts import render
from django.views import View

class RegisterView(View):
    def get(self , request):
        return render(request , 'register.html')

    def post(self , request):
        pass

4. 分发路由

from django.urls import path
from users import views
urlpatterns = [
    path('register/' , views.RegisterView.as_view())
]

注册界面展示

在这里插入图片描述

二. 创建用户模型类

  1. 创建用户模型类 , 继承Django原有user表

    from django.db import models
    from django.contrib.auth.models import AbstractUser
    # Create your models here.
    
    
    class User(AbstractUser):
        # 创建手机号字段
        mobile = models.IntegerField(max_length=11 , unique=True)
    
        class Meta:
            db_table = 'User'
    
    
    
  2. 修改配置

    AUTH_USER_MODEL = 'user.User'
    
  3. 迁移数据库

    python manage.py makemigrations
    python manage.py migrate
    

三. 接受用户数据进行校验

1. 前端校验
let vm = new Vue({

    // 通过ID选择器找到绑定的html标签的内容
    el : '#app',
    // 修改vue的模板语法
    delimiters : ['[[',']]'],

    data : {
        // v-model
        username:'',
        password:'',
        password2:'',
        mobile:'',
        allow:'',
        image_code_url:'',
        uuid:'',
        image_code:'',
        sms_code:'',
        sms_code_tip:'获取短信验证码',
        // 该变量作为标记,默认允许访问
        sand_flag:false,
        

        // v-show
        error_name:false,
        error_password:false,
        error_password2:false,
        error_mobile:false,
        error_allow:false,
        error_image_code:false,
        error_sms_code:false,

        // 自定义错误信息
        error_name_message:'',
        error_sms_code_message:'',
    },

    // 这个方法会在页面加载之后被调用
    mounted(){
        this.generate_image_code();
    },

    // 定义事件方法
    methods:{
        // 校验短信验证码
        check_sms_code() {
          if(this.sms_code.length != 5){
              this.error_sms_code = true;
          }  else {
              this.error_sms_code = false;
          }
        },

        //发送短信验证码
        send_sms_code() {
            // 判断作为标记的变量是否允许访问
            if (this.sand_flag == true ){
                // 当标记为true时,说明短时间内已经发送请求了,不允许访问停止方法。
                return;
            }
            // 标记允许访问,可以实现发送Ajax请求
            // 修改标记为不允许访问的状态
            this.sand_flag = true;

            let url = '/ver/sms_code/'+this.mobile+'/?uuid='+this.uuid+'&image_code='+this.image_code;
            axios.get(url ,{responseType: 'json'})
            // 请求成功
                .then(response => {
                    console.log(response.data.errsg)
                    // 实现发送短信验证码的倒计时
                    if (response.data.code == '0'){
                        let number = 60;
                        console.log(123)
                        let t = setInterval(() => {
                            console.log(4536)
                            // 倒计时结束
                            if(number == 1){
                                // 倒计时结束
                                // 停止回调函数的执行
                                clearInterval(t)
                                this.sms_code_tip = '获取短信验证码';
                                // 倒计时结束之后,重新生成图片验证码
                                this.generate_image_code();
                                // 倒计时结束,把标记修改为允许访问的状态
                                this.sand_flag = false;
                            } else {
                                number -= 1 ;
                                this.sms_code_tip = number +'秒';
                            }
                        } , 1000)
                    } else {
                        // 短信验证码发送失败
                        this.error_sms_code_message = response.data.errsg;
                        this.error_sms_code = true;
                    }
                // 把标记修改为允许访问的状态
                this.sand_flag = false;
                })
            // 请求失败
                .catch(error =>{
                    console.log(error.response)
                    // 把标记修改为允许访问的状态
                    this.sand_flag = false;
                })
        },

        // 校验图片验证码
        check_image_code(){
          if(this.image_code.length != 4){
              this.error_image_code = true;
          }  else {
              this.error_image_code = false;
          }
        },

        // 生成 图片验证码的url
        generate_image_code(){
            // 通过生成uuid来对用户进行标识
            this.uuid = generateUUID()
            this.image_code_url = '/ver/image_code/'+this.uuid+'/'
        },

        // 校验用户名
        check_username(){
            // 定义用户名的规则
            let re = /^[A-Za-z0-9_]{5,15}$/;
            // 判断接收到的数据是否符合条件
            if(re.test(this.username)){
                // 数据合法
                this.error_name = false;
            } else {
                // 用户名不合法
                this.error_name = true;
                this.error_name_message = "用户名不合法 , 应当使用A-Za-z0-9_"
            }

            // 判断用户是否重复
            // 前提保证用户名合法
            if(this.error_name == false){
                // 发送ajax请求
                let url = '/user/username/'+ this.username +'/count/';
                axios.get(
                    url , {responseType :'json'}
                )
                // 请求成功
                    .then(response => {
                        // 获取后端传递过来的数据 response.data
                        if(response.data.count == 1){
                            // 用户已存在
                            this.error_name_message = '用户名已存在';
                            this.error_name = true;
                        } else {
                            this.error_name = false;
                        }
                    })
                // 请求失败
                    .catch(error =>{
                        console.log(error.response)
                    })
            }
        },


        // 校验密码
        check_password(){
            // 密码中合法的字符
            let re=/^[0-9a-zA-Z]{6,20}$/;
            if(re.test(this.password)){
                // 符合要求 , 密码字符合法
                this.error_password = false;
            } else {
                // 密码不合法 ,显示错误信息
                this.error_password = true;
            }
        },

        // 校验两次密码是否一致
        check_password2(){
            if(this.password2 == this.password){
                this.error_password2 = false;
            } else {
                this.error_password2 = true;
            }
        },

        // 校验手机号
        check_mobile(){
            let re =/^1[3-9]\d{9}$/;
            if(re.test(this.mobile)){
                this.error_mobile = false;
            } else {
                this.error_mobile = true;
            }
        },

        // 校验勾选框是否勾选
        check_allow(){
            if(this.allow){
                this.error_allow = false;
            } else {
                this.error_allow = true;
            }
        },

        // 校验表单中数据是否全部合格
        on_submit(){
            // 调用所有校验数据的方法
            this.check_username();
            this.check_password();
            this.check_password2();
            this.check_mobile();
            this.check_allow();
            // 判断error的对应值是否为true , 如果其中有一个为true则限制提交
            if(this.error_name == true || this.error_password == true ||
                this.error_password2 == true || this.error_mobile == true || this.error_allow == true){
                // 禁止表单提交
                window.event.returnValue = false;
            }
        },

    }


})
2. 后端校验数据是否合法, 两次输入密码是否一致 – 定义forms表单
  1. 在当前app中创建forms模块

    from django import forms
    
    class RegisterForms(forms.Form):
        username = forms.CharField(min_length=5,max_length=15,
                                   error_messages={
                                       "min_length":"用户名太短",
                                       "max_length":"用户名太长",
                                       "required":"用户名不允许为空"
                                   })
    
        password = forms.CharField(min_length=6, max_length=20,
                                   error_messages={
                                       "min_length": "密码名太短",
                                       "max_length": "密码名太长",
                                       "required": "密码不允许为空"
                                   })
    
        password2 = forms.CharField(min_length=6, max_length=20,
                                   error_messages={
                                       "min_length": "用户名太短",
                                       "max_length": "用户名太长",
                                       "required": "用户名不允许为空"
                                   })
    
        mobile = forms.IntegerField(min_length=11, max_length=11,
                                    error_messages={
                                        "min_length": "手机号不合法",
                                        "max_length": "手机号不合法",
                                        "required": "手机号不允许为空"
                                    })
        
        
        # 校验两次输入是否一致
        def clean(self):
            clean_data = super(RegisterForms, self).clean()
            pw = clean_data.get('password')
            pw2 = clean_data.get('password2')
            if pw != pw2:
                raise forms.ValidationError
            
            return clean_data
    
  2. 将forms组件传入视图进行数据校验

    class RegisterView(View):
        def get(self , request):
            return render(request , 'register.html')
    
        def post(self , request):
    
            # 将用户数据传入forms组件进行校验
            register_forms = RegisterForms(request.POST)
    		
    		# 这里先返回httpresponse进行测试
            if register_forms.is_valid():
                return HttpResponse("注册成功")
    
            return HttpResponse("注册失败")
    

    下节介绍用户名重复校验 , 图形验证码制作 , 以及短信验证码生成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1642081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql 指定根目录 迁移根目录

mysql 指定根目录 迁移根目录 1、问题描述2、问题分析3、解决方法3.1、初始化mysql前就手动指定mysql根目录为一个大的分区(支持动态扩容),事前就根本上解决mysql根目录空间不够问题3.1.0、方法思路3.1.1、卸载mariadb3.1.2、下载Mysql安装包3.1.3、安装Mysql 8.353…

华为机考入门python3--(22)牛客22- 汽水瓶

分类:数字 知识点: 整除符号// 5//3 1 取余符号% 5%3 2 题目来自【牛客】 import sysdef calc_soda_bottles(n):if n 0: # 结束输入,不进行处理returnelse:# 循环进行汽水换算total_drunk 0 # 记录总共喝了多少瓶汽水while…

手把手教你安装 Garnet

什么是 Garnet Garnet 是微软使用 C# 编写的 Redis 客户端兼容缓存组件,你可以使用 Redis 客户端的连接方式来连接 Garnet 但是 Garnet 需要 .NET8 运行环境才可以使用,为了便捷性,可以考虑构建成 Docker 镜像 裸机部署 首先,…

初始数据类型

注释补充 在我们编写任何代码的时候,都有一个叫做注释的功能 在golang中有两种 单行注释 // 如下图所示 加入了注释的话,代码在执行的时候会自动忽视这段内容 //fmt.Println("天上") //fmt.Println("天下") //fmt.Println("唯…

Web端重叠路径可视化

近几年来,由于信息技术的发展,大数据成为了这个时代的代名词之一,“数据可视化”风靡一时。得益于HTML5提供的新标签“canvas”,Web端也能分“数据可视化”一杯羹。 随着越来越多的可视化方案和需求,需要解决问题也越来…

Java中接口的默认方法

为什么要使用默认方法 当我们把一个程序的接口写完后 用其他的类去实现,此时如果程序需要再添加一个抽象方法的时候我们只有两种选择 将抽象方法写在原本的接口中 但是这样写会导致其他所有改接口的实现类都需要实现这个抽象方法比较麻烦 写另一个接口 让需要的实…

Sqli-labs第一关到第四关

目录 一,了解PHP源代码 二,破解第一关 2.1在了解完源码之后,我们重点看一下 2.2破解这道题表中有几列 2.3查看表中哪一列有回显 2.4查询库,表,列信息 三,总结 前提: 之所以把1234关…

2024年5月5日 十二生肖 今日运势

小运播报:2024年5月5日,星期日,农历三月廿七 (甲辰年己巳月己巳日),法定节假日。 红榜生肖:牛、猴、鸡 需要注意:鼠、虎、猪 喜神方位:东北方 财神方位:正…

eSIM IoT vs M2M vs Consumer

有任何关于GSMA\IOT\eSIM\RSP\业务应用场景相关的问题,欢迎W: xiangcunge59 一起讨论, 共同进步 (加的时候请注明: 来自CSDN-iot). 截至2023年5月,全球移动通信系统协会(GSMA)发布了三个关键的eSIM技术规范,这些规…

2000-2020年县域创业活跃度数据

2000-2020年县域创业活跃度数据 1、时间:2000-2020年 2、指标:地区名称、年份、行政区划代码、经度、纬度、所属城市、所属省份、年末总人口万人、户籍人口数万人、当年企业注册数目、县域创业活跃度1、县域创业活跃度2、县域创业活跃3 3、来源&#…

【前端项目——分页器】手写分页器实现(JS / React)

组件介绍 用了两种方式实现,注释详细~ 可能代码写的不够简洁,见谅🙁 1. 包含内容显示的分页器 网上看了很多实现,很多只有分页器部分,没和内容显示联动。 因此我增加了模拟content的显示,这里模拟了32条数…

JavaEE初阶Day 15:文件IO(1)

目录 Day 15:文件IO(1)IO文件1. 路径2. 文件的分类3. 使用Java针对文件系统进行操作3.1 属性3.2 构造方法3.3 方法 Day 15:文件IO(1) IO I:Input输入 O:Output输出 输入输出规则…

使用机器学习确定文本的编程语言

导入必要的库 norman Python 语句&#xff1a;import <span style"color:#000000"><span style"background-color:#fbedbb"><span style"color:#0000ff">import</span> pandas <span style"color:#0000ff&quo…

onedrive下載zip檔案有20G限制,如何解決

一般來說&#xff0c;OneDrive網頁版對文件下載大小的限制如下圖所示&#xff0c;更多資訊&#xff0c;請您參考這篇文章&#xff1a;OneDrive 和 SharePoint 中的限制 - Microsoft Support 因此我們推薦您使用OneDrive同步用戶端來同步到本地電腦&#xff0c;您也可以選擇只同…

【实验】使用docker-compose编排lnmp(dockerfile) 完成Wordpress 部署

环境准备 docker&#xff1a;192.168.67.30 虚拟机&#xff1a;4核4G 关闭防火墙 systemctl stop firewalld systemctl disable firewalld setenforce 0 安装docker 直接点击【复制】粘贴到xshell中即可&#xff0c; 执行过程中若出现睡眠(sleep)通过 kill -9 pid号 &#x…

库存管理系统开源啦

软件介绍 ModernWMS是一个针对小型物流仓储供应链流程的开源库存管理系统。该系统的开发初衷是为了满足中小型企业在有限IT预算下对仓储管理的需求。通过总结多年ERP系统研发经验&#xff0c;项目团队开发了这套适用于中小型企业的系统&#xff0c;以帮助那些有特定需求的用户。…

vector的使用

1.构造函数 void test_vector1() {vector<int> v; //无参的构造函数vector<int> v2(10, 0);//n个value构造&#xff0c;初始化为10个0vector<int> v3(v2.begin(), v2.end());//迭代器区间初始化,可以用其他容器的区间初始化vector<int> v4(v3); //拷贝…

【 书生·浦语大模型实战营】作业(六):Lagent AgentLego 智能体应用搭建

【 书生浦语大模型实战营】作业&#xff08;六&#xff09;&#xff1a;Lagent & AgentLego 智能体应用搭建 &#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方…

jupyter notebook 设置密码报错ModuleNotFoundError: No module named ‘notebook.auth‘

jupyter notebook 设置密码报错ModuleNotFoundError: No module named ‘notebook.auth‘ 原因是notebook新版本没有notebook.auth 直接输入以下命令即可设置密码 jupyter notebook password

链表的带环问题 链表的深度拷贝

1.1. 链表是否带环 代码很简单&#xff0c;最主要就是如何证明 首先判断链表是否带环&#xff0c;可以定义两个指针&#xff0c;一个快指针一个慢指针。快指针走两步&#xff0c;慢指针走一步一定会相遇吗&#xff1f;有没有可能会超过&#xff1f;假设进环的时候fast和slow的…