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

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

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'
  1. 修改配置
AUTH_USER_MODEL = 'user.User'
  1. 迁移数据库
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
  1. 将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("注册失败")
  1. 下节介绍用户名重复校验 , 图形验证码制作 , 以及短信验证码生成
相关文章
|
2月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
116 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
2月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
96 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
2月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
87 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
2月前
|
Linux Python
解决django项目报错很离谱的报错之RuntimeError: populate() isn't reentrant
解决django项目报错很离谱的报错之RuntimeError: populate() isn't reentrant
|
2月前
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台。果蔬识别系统,本系统使用Python作为主要开发语言,通过收集了12种常见的水果和蔬菜('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜'),然后基于TensorFlow库搭建CNN卷积神经网络算法模型,然后对数据集进行训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地文件方便后期调用。再使用Django框架搭建Web网页平台操作界面,实现用户上传一张果蔬图片识别其名称。
51 0
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
3月前
|
运维 Devops 测试技术
一个人活成一个团队:python的django项目devops实战
DevOps通过自动化的流程,使得构建、测试、发布软件能够更加地快捷、频繁和可靠。本文通过一个python的django个人博客应用进行了DevOps的实战,通过DevOps拉通开发和运维,通过应用云效的DevOps平台实现自动化“软件交付”的流程,使得构建、测试、发布软件能够更加地快捷、频繁和可靠,提交研发交付效率。作为个人项目也是可以应用devops提高效率。
50 3
|
3月前
|
监控 数据可视化 前端开发
基于python django的电商数据分析系统,包括大屏和登录
本文介绍了一个基于Python Django框架开发的电商数据分析系统,该系统具备大屏展示功能和用户登录机制,旨在帮助电商企业实时监控和分析销售数据,支持多维度数据分析和趋势预测。
基于python django的电商数据分析系统,包括大屏和登录
|
3月前
|
JSON API 数据安全/隐私保护
Django 后端架构开发:JWT 项目实践与Drf版本控制
Django 后端架构开发:JWT 项目实践与Drf版本控制
63 0
|
3月前
|
存储 前端开发 Serverless
中后台前端开发问题之Django项目中接收和处理用户的抽奖请求如何解决
中后台前端开发问题之Django项目中接收和处理用户的抽奖请求如何解决
18 0
|
4月前
|
安全 前端开发 API
震惊!掌握Django/Flask后,我竟然轻松征服了所有Web项目难题!
【7月更文挑战第15天】Python Web开发中,Django以其全面功能见长,如ORM、模板引擎,助你驾驭复杂需求;Flask则以轻量灵活取胜,适合快速迭代。两者结合使用,无论是数据库操作、用户认证还是API开发,都能让你应对Web挑战游刃有余。掌握这两者,Web项目难题变得易如反掌!
75 10