[django项目] 用户注册功能 之 注册用户到数据库

2023-11-05

VIIII. 注册功能

谋定而后动, 先做分析在写代码

1>业务流程分析

  1. 对参数进行校验
    1. 判断用户名是否为空,是否已注册
    2. 判断密码是否为空, 是否一致,格式是否正确
    3. 判断手机号码是否为空,格式是否正确
    4. 判断短信验证码是否为空,格式是否正确,是否与真实短信验证码相同
  2. 新建数据库记录

2>接口设计

2.1>接口说明:

类目 说明
请求方法 POST
url定义 /user/register/
参数格式 表单

注意:post请求,前端请求要带上csrf token

2.2>参数说明:

参数名 类型 是否必须 描述
username 字符串 用户输入的用户名
password 字符串 用户输入的密码
password_repeat 字符串 用户输入的重复密码
mobile 字符串 用户输入的手机号码
sms_code 字符串 用户输入的短信验证码

2.3>返回结果:

{
    "errno": "0", 
 	"errmsg": "恭喜您,注册成功!", 
}

我们选择使用ajax来实现注册提交

3.后端代码

  1. user/views.py代码:

    from django.shortcuts import render
    from django.views import View
    
    from .forms import RegisterForm
    from .models import User
    from utils.json_res import json_response
    from utils.res_code import Code, error_map
    
    
    class RegisterView(View):
        """
        注册视图
        /users/register
        """
        def get(self, request):
            """
            凡是来访问这个视图的请求, 就返回注册页面
            :param request: 请求注册页面
            :return: 注册页面
            """
            return render(request, 'users/register.html')
    
        def post(self, request):
            # 1>校验数据
            form = RegisterForm(request.POST)
            if form.is_valid():
                # 2>创建数据
                username = form.cleaned_data.get('username')
                password = form.cleaned_data.get('password')
                mobile = form.cleaned_data.get('mobile')
                User.objects.create_user(username=username, password=password, mobile=mobile)
                return json_response(errmsg='恭喜你,注册成功!')
            else:
                # 引发的错误可能会有多条错误信息,如果出错了,就将表单的报错信息进行拼接,
                err_msg_list = []
                for item in form.errors.values():
                    # 遍历的item也是一个列表, 其中的第一个元素是报错信息
                    err_msg_list.append(item[0])
                err_msg_str = '/'.join(err_msg_list)
                # 由于是参数错误, 所以使用Code.PARAMERR
                return json_response(errno=Code.PARAMERR, errmsg=err_msg_str)
    
  2. user/forms.py代码:

    import re
    
    from django import forms
    from django_redis import get_redis_connection
    
    from .models import User
    from verification.constants import SMS_CODE_LENGTH
    
    
    class RegisterForm(forms.Form):
        username = forms.CharField(label='用户名', max_length=20, min_length=5,
                                   error_messages={
                                       'max_length': '用户名长度要小于20',
                                       'min_length': '用户名长度要大于4',
                                       'required': '用户名不能为空'
                                   })
        password = forms.CharField(label='密码', max_length=20, min_length=6,
                                   error_messages={
                                       'max_length': '密码长度要小于20',
                                       'min_length': '密码长度要大于5',
                                       'required': '用户名不能为空'
                                   })
        password_repeat = forms.CharField(label='确认密码', max_length=20, min_length=6,
                                          error_messages={
                                              'max_length': '密码长度要小于20',
                                              'min_length': '密码长度要大于5',
                                              'required': '用户名不能为空'
                                          })
        mobile = forms.CharField(label='手机号码', max_length=11, min_length=11,
                                 error_messages={
                                     'max_length': '手机号码长度有误',
                                     'min_length': '手机号码长度有误',
                                     'required': '手机号码不能为空'
                                 })
        sms_code = forms.CharField(label='短信验证码', max_length=SMS_CODE_LENGTH, min_length=SMS_CODE_LENGTH,
                                   error_messages={
                                       'max_length': '短信验证码长度有误',
                                       'min_length': '短信验证码长度有误长度有误',
                                       'required': '短信验证码不能为空'
                                   })
        
        # 当想要详细的提示用户的错误时,建议使用这种单字段校验
        def clean_username(self):
            """
            校验用户名
            :return:
            """
            username = self.cleaned_data.get('username')
            if User.objects.filter(username=username).exists():
                return forms.ValidationError('用户名已存在!')
            return username
    
        def clean_mobile(self):
            """
            校验手机号
            :return:
            """
            mobile = self.cleaned_data.get('mobile')
            if not re.match(r'^1[3-9]\d{9}$', mobile):
                raise forms.ValidationError('手机号码格式不正确')
    
            if User.objects.filter(mobile=mobile).exists():
                raise forms.ValidationError('手机号码已注册!')
    
            return mobile
    
        def clean(self):
            """
            联合校验,密码,和短信验证码
            :return:
            """
            clean_data = super().clean()
            # 校验密码是否一致
            password = clean_data.get('password')
            password_repeat = clean_data.get('password_repeat')
            if password != password_repeat:
                raise forms.ValidationError('两次密码不一致!')
    
            # 校验短信验证码
            sms_code = clean_data.get('sms_code')
            moblie = clean_data.get('mobile')
    
            redis_conn = get_redis_connection(alias='verify_code')
            real_code = redis_conn.get('sms_text_{}'.format(moblie))
            if (not real_code) or (real_code.decode('utf-8') != sms_code):
                raise forms.ValidationError('短信验证码错误!')
            
            return clean_data
    

4.前端js代码

$(function () {
    // 定义状态变量
    let isUsernameReady = false,
        isPasswordReady = false,
        isMobileReady = false;

    // 1.点击刷新图像验证码
    let $img = $('.form-contain .form-item .captcha-graph-img img');
    

    $img.click(function () {...});

    // 2.鼠标离开用户名输入框校验用户名
    let $username = $('#username');
    $username.blur(fnCheckUsername);

    function fnCheckUsername () {....}

    // 3.检测密码是否一致
    let $passwordRepeat = $('input[name="password_repeat"]');
    $passwordRepeat.blur(fnCheckPassword);

    function fnCheckPassword () {...}

    // 4.检查手机号码是否可用
    let $mobile = $('input[name="mobile"]');
    $mobile.blur(fnCheckMobile);

    function fnCheckMobile () {...}

    // 5.发送手机验证码
    let $smsButton = $('.sms-captcha');
    $smsButton.click(function () {...});

    // 6.注册
    let $submitBtn = $('.register-btn');
    $submitBtn.click((e)=>{
        // 阻止默认提交, 目的是防止点击立即注册后提交数据
        e.preventDefault();
        // 点击后的工作,首先是校验我们的数据,可以直接复用上面的定义方法
        // 1.校验用户名
        if(!isUsernameReady){
            fnCheckUsername();
            return
        }
        // 2.校验密码
        if(!isPasswordReady){
            fnCheckPassword();
            return
        }
        // 3.校验电话号码
        if(!isMobileReady){
            fnCheckMobile();
            return
        }
        // 4.校验短信验证码
        let sSmsCode = $('input[name="sms_captcha"]').val();
        if(sSmsCode === ''){
            message.showError('短信验证码不能为空!');
            return
        }
        if(!(/^\d{4}$/).test(sSmsCode)){
            message.showError('短信验证码长度不正确,必须是4位数字!');
            return
        }

        $.ajax({
            url: '/users/register/',
            type: 'POST',
            data:{
                username: $username.val(),
                password: $('input[name="password"]').val(),
                password_repeat: $passwordRepeat.val(),
                mobile: $mobile.val(),
                sms_code: sSmsCode,
            },
            dataType: 'json',
            success: function (res) {
                if(res.errno === '0'){
                    message.showSuccess('恭喜您,注册成功!');
                    // 注册成功后延时1.5秒跳转
                    setTimeout(function () {
                        //注册成功后重定向到登录页面
                        window.location.href = '/users/login/'
                    }, 1500)
                }else{
                    //注册失败
                    message.showError(res.errmsg)
                }
            },
            error: function () {
                message.showError('服务器超时,请重试!')
            }
        })

    });
});

页面效果:
在这里插入图片描述
数据库中:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[django项目] 用户注册功能 之 注册用户到数据库 的相关文章

  • 为什么 Django 的 URLField 默认截断为 200 个字符?

    我喜欢 Django 并且经常使用它 我发现它的大部分默认设置都是正常的 但有一个一直困扰着我 以至于我在每个项目中都覆盖了它 a 的默认最大长度URLField https github com django django blob st
  • 静态文件配置不正确

    我已经在 Heroku 上部署了简单的博客应用程序 它运行在Django 1 8 4 我在静态文件方面遇到了一些问题 当打开我的应用程序时 我看到Application Error页面 所以我尝试调试它并发现当我提交到 Heroku 时它无
  • 使用信号时出现 django TransactionManagementError

    我有一个与 django 的用户和 UserInfo 一对一的字段 我想订阅用户模型上的 post save 回调函数 以便我也可以保存 UserInfo receiver post save sender User def saveUse
  • 不想每次更新 css/js 时都清除浏览器缓存

    我有 python django 网站 其中包含 css 和 js 文件 每次更新 添加 css 或 js 都必须清除浏览器的缓存 然后才能反映在浏览器中 有什么具体方法可以避免每次缓存清除和检查吗 django 中是否有任何特定设置可以避
  • 测试中的模型 - Django 1.7 问题

    我正在尝试将我的项目移植为使用 Django 1 7 除了一件事之外 一切都很好 测试文件夹内的模型 Django 1 7 新迁移在内部运行 migrate 命令 在运行syncdb之前 这意味着如果模型未包含在迁移中 它将不会填充到数据库
  • 扩展 Django 1.11 用户模型

    我正在尝试弄清楚如何扩展 Django 用户模型以向用户添加信息 我似乎无法让它发挥作用 我究竟做错了什么 我可以在扩展的同一模型中使用外键吗 如何创建超级用户 还是必须通过手动创建python manage py shell 到目前为止
  • Django + uwsgi + ngnix + 调试关闭 = 服务器错误(500)

    我正在尝试设置一个由 Django uwsgi Nginx 组成的生产服务器 我正在关注的教程位于此处http www panta info blog 3 how to install and configure nginx uwsgi a
  • Django - 缺少 1 个必需的位置参数:'request'

    我收到错误 get indiceComercioVarejista 缺少 1 个必需的位置参数 要求 当尝试访问 get indiceComercioVarejista 方法时 我不知道这是怎么回事 views from django ht
  • 如何从 Django 管理员触发 Celery 任务?

    我有一个模型叫Publication我想在 Django Admin 的列表视图中添加一个按钮 以允许触发 Celery 任务 admin py from django contrib import admin from models im
  • django:django.utils.function.SimpleLazyObject 的目的?

    我遇到了分配的问题request user到一个名为prior user 然后基本上对用户进行了身份验证 然后检查是否request user prior user 我预计它们不会相同prior user应包含 AnonymousUser
  • 将应用程序级别用户名/用户 ID 注入 nginx/Apache 日志

    有没有办法将应用程序级别的用户名或 id 在本例中为 django 用户名或 id 注入 Apache 或 ngnix 日志中 请注意 我不是询问 HTTP 身份验证用户名 我目前正在使用一个简短的自定义中间件将此数据添加到响应标头 如下所
  • 使用 chrome 扩展和 Django 进行身份验证

    对于那些熟悉 django 和 chrome 扩展的人 如何使用 cookie 进行身份验证 以便当您登录 django 制作的网站时 您的 chrome 扩展程序也会登录并激活 谢谢 您的 Chrome 扩展程序 通过 Javascrip
  • django 南迁移,不设置默认值

    我使用 South 来迁移我的 Django 模型 然而 南方有一个令人讨厌的错误 它不会在 Postgres 数据库中设置默认值 例子 created at models DateTimeField default datetime no
  • Django 使用用户/IP 进行日志记录

    我正在使用 logging 模块来记录大量消息 我想将 用户 request user 添加到日志中 但是 虽然它在视图函数中可用 但我不想将其传递给所有助手 有谁知道这个方法吗 我正在考虑以某种方式跟踪跟踪 直到找到参数中带有 请求 的函
  • 如何使用 django 过滤器 icontains 获取多个字段

    我正在尝试将查询搜索与所有模型字段进行比较 但我不知道如何在多个字段中执行此操作 这是我的代码 expense Expense objects filter user request user id order by date q requ
  • Mac 上的 GeoDjango 和 Spatialite:C 扩展加载问题

    我正在关注GeoDjango 教程 https docs djangoproject com en dev ref contrib gis tutorial 在我的家用计算机 运行 OSX 10 8 2 的 Mac Mini 上为我的项目设
  • 我可以在pycharm中的断点处进入交互模式吗

    我是一个相当新的 Pycharm 3 用户 正在从事 django 项目 我可以在 pycharm3 中的断点处进入交互模式吗 这可能吗 当程序在断点处停止时 我尝试过工具 gt 打开调试命令行 但我没有看到控制台打开 我怎样才能让它发挥作
  • 401 Unauthorized("detail":"未提供身份验证凭据。")

    我在后端使用 djoser 的身份验证 当我通过具有内容类型和授权标头的邮递员在 account me 发出获取请求时 我得到了正确的响应 但是当我尝试从我的角度客户端执行相同的请求时 我得到401 Unauthorized detail
  • 如何使用 celery 和 Django 以编程方式生成 celerybeat 条目

    我希望能够以编程方式生成 celerybeat 条目并在添加条目时重新同步 celerybeat 文档here http ask github com celery userguide periodic tasks html state 默
  • 使用 Celery 通过 Gevent 进行实时、同步的外部 API 查询

    我正在开发一个 Web 应用程序 该应用程序将接收用户的请求 并且必须调用许多外部 API 来编写对该请求的答案 这可以直接从主 Web 线程使用 gevent 之类的东西来扇出请求来完成 或者 我在想 我可以将传入的请求放入队列中 并使用

随机推荐

  • VM虚拟机桥接模式无法联网解决办法

    1 背景介绍 桥接模式 使虚拟机客户机可以和主机在同一网段 这样 和主机同局域网内的其他主机就也可以ping到虚拟机了 因此 虚拟机设置为桥接模式 且设为静态IP 这样以后就可以方便的使用虚拟机了 2 问题描述 桥接模式之前是好用的 但是主
  • 大话linux运用层访问到硬件驱动层过程

    维哥简述 面试就这么答就OK 今天面试居然忘记了 老司机也翻车 唉 概论流程图 如下图所示 1 当运用程序调用open dev path mode 时 2 虚拟文件系统 vfs 的sys open 函数就会被调用 该函数会在dev path
  • SQLServer中使用加密函数,解密函数

    加密函数 加密 password 要加密的字段 Salt 盐值 pwd 加密后的数据 Create FUNCTION dbo EncryptByPassPhrasePwd password nvarchar 200 Salt nvarcha
  • Unity5.4 Assetbundles官方说明七(在AssetBundle中存储和加载二进制数据)

    转 https blog csdn net u010377179 article details 52922717 第一步是用 bytes 的扩展名保存二进制文件 Unity将把这个文件作为一个TextAsset文本资源 这样就可以打包成A
  • Linux中chown与chmod两个命令的区别详解

    今天小编就为大家分享一篇关于Linux中chown与chmod两个命令的区别详解 小编觉得内容挺不错的 现在分享给大家 具有很好的参考价值 需要的朋友一起跟随小编来看看吧 在linux系统中 chmod和chown命令都可以来设置权限 但他
  • vue项目Error:Cannot find module ‘xxx’ 类报错的解决方法

    现发现只要是报错Error Cannot find module xxx 例如 Error Cannot find module webpack 这类的问题都可以用下面的方法解决 报错内容如下 运行cnpm install没问题 运行cnp
  • 高通平台 Display 杂记

    一 代码位置 User space SurfaceTexture frameworks native libs gui SurfaceFlinger frameworks native services surfaceflinger Gra
  • 【python之argparse模块学习】简单入门

    目录 0 前言 1 入门程序 2 参数 2 1 位置参数 2 2 可选参数 2 3 矛盾选项 3 总结 4 参考文献 0 前言 该模块地位 Python 标准库中推荐的命令行解析模块 类比linux命令ls来理解该模块功能 与该命令类似的
  • 杂音 & pop 音的解决方法

    杂音 pop 音的解决方法 1 喇叭有严重的 吱吱 破音 绝大多数的原因有可能在于V out 电压不稳定 所以最好测一下无负载时的输出电压 同时也可以测量 VCC 即boost 的输出 输入电压 正常的VCC 可以通过客户的 反馈电阻和 V
  • 解决Error:Kotlin: Module was compiled with an incompatible version of Kotlin. The binary version of ..

    文章目录 1 问题 2 分析问题 3 升级kotlin插件版本 3 1 升级方法1 3 1 升级方法2 4 其他问题 4 1 方法1中的Cannot download Read timed out问题 4 2 方法2中的Plugin Kot
  • 23种常用设计模式(C++)

    Part One Methods for constrcting a new object 1 Factory method 我们把简单工厂方法归类到工厂方法中 工厂方法的目的是用来解决具有同一接口 基类 派生类对象的生成问题 尽管可以通过
  • vray渲染白屏卡死_3DMAX使用VRay渲染的时候,在building embree static这一步最后一点卡死...

    DMAX使用vray渲染的时候 在building embree static这一步最后一点卡死是参数设置错误 解决方法如下 1 在我们为场景打好vray灯光以后 要设置vray渲染的参数 按 F10 打开vray渲染编辑器 在 公用 下栏
  • react-Suspense工作原理分析

    Suspense 基本应用 Suspense 目前在 react 中一般配合 lazy 使用 当有一些组件需要动态加载 例如各种插件 时可以利用 lazy 方法来完成 其中 lazy 接受类型为 Promise lt gt default
  • 大数据从入门到精通文章体系

    大数据知识可谓是多而杂 大数据相关的组件更是数不胜数 但是我们每一次的感受到学习的累 就足以证明我们在认真的学习 每感到到一次累的同时 就应该感受到一次进步 所以不要让自己停下来 各位小伙伴冲冲冲 大数据系列资源链接 名称 链接 提取码 H
  • PS笔记2

    第01堂课 出识Ps 图像处理软件 学习ps要做到三点 了解基本概念 掌握操作规律 开发扩展思维 第02堂课 软件安装 百度搜索ps 下载 会发现两种下载情况 第一种不需要安装 解压后在文件里直接找到PS图标 打开就可以了 第二种安装包 安
  • 织梦网站调用变量失败_织梦dedecms无法调用新添加变量的解决办法

    织梦dedecms无法调用新添加变量 在项目中使用了几次织梦cms程序 感觉越来越好用 以前刚接触dedecms时一看后台界面 如此之乱 使我心乱如麻 不知从何下手 后来因为工作逐渐就熟悉了它的后台 特别是一些客户的特殊要求 靠dede自带
  • Ubuntu配置国内源

    Ubuntu配置国内源 Ubuntu源 使用配置生成器 安装依赖包 打开apt源配置文件 国内apt源 中科大源 阿里源 Ubuntu源 每个 Ubuntu 版本都有自己的一组四个官方存储库 Main Canonical 支持的自由开源软件
  • Qt4_写FTP客户端

    写FTP客户端 QFtp类在Qt中实现了FTP协议的客户端程序 它提供了非常多的函数来执行多数常见的FTP操作 同时还可以执行任意的FTP指令 QFtp类是异步工作的 若调用一个像get 或者put 这样的函数 它会立即返回并且仅在控制权回
  • 创建 VirtualBoxClient COM对象失败

    错误问题描述 安装VirtualBox程序 鼠标右键点击VirtualBox属性 在兼容性选项中 勾选兼容性模式运行这个程序 下拉选择 Windows Server 2008 Service Pack 1 勾选以管理员身份运行此程序 3 点
  • [django项目] 用户注册功能 之 注册用户到数据库

    VIIII 注册功能 谋定而后动 先做分析在写代码 1 gt 业务流程分析 对参数进行校验 判断用户名是否为空 是否已注册 判断密码是否为空 是否一致 格式是否正确 判断手机号码是否为空 格式是否正确 判断短信验证码是否为空 格式是否正确