Django继承User表实现注册和登录

news2024/11/18 19:57:00

Django继承User表实现注册和登录

django中已经有了user表,这篇文章将为大家详细讲解有关Django如何继承自带user表并重写。

一、后端部分

1、引入AbstractUser并继承

(1)、引入

from django.contrib.auth.models import AbstractUser

**(2)、继承 **

class User(AbstractUser):

    phone = models.CharField(max_length=11, null=True, verbose_name="手机号")

    class Meta:
        db_table = "tb_user"
        verbose_name = "用户表"
        verbose_name_plural = verbose_name
2、在settings.py中配置
AUTH_USER_MODEL = "users.User"
3、配置app以及跨域
INSTALLED_APPS = [
    'users.apps.UsersConfig',  # 用户app
    'corsheaders',  		   # 跨域
]

# 中间件
MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',         # 跨域中间件
    # 'django.middleware.csrf.CsrfViewMiddleware',   # 注释掉CSRF这一行
]

CORS_ORIGIN_ALLOW_ALL = True    # 允许所有请求
4、生成迁移文件并执行迁移
python manage.py makemigrations  	# 生成迁移文件
python manage.py migrate			# 执行迁移文件
5、编写视图
from django.contrib.auth.hashers import make_password, check_password
from django.views import View
from django.http.response import JsonResponse

import re

from .models import User


class RegisterView(View):
    """
    @author donghm
    @date 2024-05-16
    用户注册
    """

    def post(self, request):
        username = request.POST.get('username')
        email = request.POST.get('email')
        phone = request.POST.get('phone')
        password = request.POST.get('password')

        # 校验数据是否有空值
        if not all([username, email, phone, password]):
            return JsonResponse({'data': {}, 'message': '数据不完整,请检查数据', 'code': 0})

        # 校验用户是否已存在
        user_obj = User.objects.filter(username=username).first()
        if user_obj:
            return JsonResponse({'data': {}, 'message': '用户已存在', 'code': 0})

        # 校验手机号
        phone_pattern = re.compile(r'1[3-9]\d{9}$')
        phone_info = phone_pattern.match(phone)

        if not phone_info:
            return JsonResponse({'data': {}, 'message': '手机号不正确', 'code': 0})

        user = User.objects.create(
            username=username,
            email=email,
            phone=phone,
            password=make_password(password)
        )

        return JsonResponse({'data': {"id": user.id}, 'message': '注册成功', 'code': 1})


class LoginView(View):
    """
    @author donghm
    @date 2024-05-16
    用户登录接口
    """

    def post(self, request):
        username = request.POST.get('username')
        password = request.POST.get('password')

        user = User.objects.filter(username=username).first()

        if not user:
            return JsonResponse({'data': {}, 'message': '用户不正确,请重新输入', 'code': 0})

        is_correct = check_password(password, user.password)
        if not is_correct:
            return JsonResponse({'data': {}, 'message': '密码校验失败', 'code': 0})

        if user and is_correct:
            return JsonResponse({'data': {"username": username, "user_id": user.id}, 'message': 'success', 'code': 1})


6、配置路由

(1)、app下的urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('register/', views.RegisterView.as_view(), name='register'),
    path('login/', views.LoginView.as_view(), name='login'),
]

(2)、主路由下配置

from django.urls import path, include

urlpatterns = [
    path('users/', include('users.urls')),
]

默认urls.py文件是不存在的,需要进行创建。

7、使用postman对接口进行测试

(1)、注册

在这里插入图片描述

(2)、登录

a、登录失败

在这里插入图片描述

b、登录成功

在这里插入图片描述

8、接口文档

开发当中,接口文档还是很重要的,优雅的写好你的接口文档,有以下好处:

1、前后端联调时非常方便,前端人员可以根据请求地址、请求方式以及所需要的参数去获取,省去很多麻烦。

2、后端人员可以根据接口文档知道当前接口所要做的事情以及所需要的参数。

3、离职后交接代码也会很省心。

接口文档格式

1)、请求地址

http://127.0.0.1:8000/users/register/

2)、请求方式

post

3)、接口说明

根据所提供的参数,注册用户信息

4)、请求参数
字段类型是否必填说明
usernamestringtrue要注册的用户的名称
passwordstringtrue用户登录时的密码
emailstringtrue用户的邮箱地址
phonestringtrue用户的手机号信息
5)、请求示例
{
    "username": "donghm",
    "password": "donghm123",
    "email": "donghm@163.com",
    "phon3": "13311112222"
}
6)、返回结果示例
{
    "data": {
        "id": 1
    },
    "message": "注册成功",
    "code": 1
}
7)、返回结果说明
字段类型说明
dataobject返回的数据
messagestring返回消息说明
codeint返回编码,1表示成功,0表示失败

二、前端部分

1、register代码

在这里插入图片描述

<template>
    <div style="margin: 30px auto;text-align: center; width: 400px">
        <h1 style="color: #484848;">用户注册</h1>
        <el-form :label-position="labelPosition" label-width="80px" :model="formRegister" >
            <el-form-item label="用户名" >
                <el-input v-model="formRegister.username"></el-input>
            </el-form-item>
            <el-form-item label="密 码">
                <el-input v-model="formRegister.password" type="password"></el-input>
            </el-form-item>
            <el-form-item label="邮 箱">
                <el-input v-model="formRegister.email"></el-input>
            </el-form-item>
            <el-form-item label="手机号">
                <el-input v-model="formRegister.phone"></el-input>
            </el-form-item>
        </el-form>
        <el-button type="primary" @click="register">注册</el-button>  
        <el-link @click="toLogin">有账号,去登录</el-link>
    </div>
</template>

<script>
import axios from 'axios';
import { MessageBox, Message } from 'element-ui';
export default {
    data() {
        return {
            labelPosition: 'right',
            formRegister: {
                username: '',
                password: '',
                email: '',
                phone: ''
            }
            
        }a
    },
    methods: {
        // 用户注册
        register(){
            let formData = new FormData()
            formData.append('username', this.formRegister.username);
            formData.append('password', this.formRegister.password);
            formData.append('email', this.formRegister.email);
            formData.append('phone', this.formRegister.phone);

            axios({
                url: 'http://127.0.0.1:8000/users/register/',
                method: 'post',
                data: formData,
            }).then(res => {
                if (res.status == 200) {
                    let result = res.data;
                    if (result.code == 1) {
                        Message.success(result.message);
                    } else {
                        Message.warning(result.message);
                    }
                } else {
                    Message.warning(res.statusText);
                }
            }).catch(err => {
                Message.warning(err.statusText);
            })
        },
        // 去登录
        toLogin() {
            this.$router.push(
                {
                    name: 'Login',
                }
            )
        }
    }
}
</script>
2、login代码

在这里插入图片描述

<template>
    <div style="margin: 30px auto;text-align: center; width: 400px">
        <h1 style="color: #484848;">用户登录</h1>
        <el-form :label-position="labelPosition" label-width="80px" :model="formLogin" >
            <el-form-item label="用户名" >
                <el-input v-model="formLogin.username"></el-input>
            </el-form-item>
            <el-form-item label="密 码">
                <el-input v-model="formLogin.password" type="password"></el-input>
            </el-form-item>
            
        </el-form>
        <el-button type="primary" @click="login">登录</el-button>  
        <el-link @click="toRegister">没有账号,去注册</el-link>
    </div>
</template>

<script>
import axios from 'axios';
import { MessageBox, Message } from 'element-ui';
export default {
    data() {
        return {
            labelPosition: 'right',
            formLogin: {
                username: '',
                password: ''
            }
        }
    }, 
    methods: {
        login() {
            let formData = new FormData();
            formData.append('username', this.formLogin.username);
            formData.append('password', this.formLogin.password);

            axios({
                url: 'http://127.0.0.1:8000/users/login/',
                method: 'post',
                data: formData
            }).then(res => {
                if (res.status == 200) {
                    let result = res.data;
                    if (result.code == 1) {
                        Message.success(result.message);
                    } else {
                        Message.warning(result.message);
                    }
                } else {
                    Message.warning(res.statusText);
                }
            }).catch(err => {
                Message.warning(err.statusText);
            })

        },
        toRegister() {
            this.$router.push({
                name: 'Register'
            })
        }
    }
}
</script>

<style>

</style>

至此,一个简单的登录注册流程就完成了,前后端全部实现,后面会继续在这个流程之上进行优化,添加上token、django的自带认证流程,让流程更加完善。

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

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

相关文章

【设计模式深度剖析】【1】【结构型】【代理模式】| 玩游戏打怪、升级为例加深理解

&#x1f448;️上一篇:创建型设计模式对比 | 下一篇:装饰器模式&#x1f449;️ 目 录 代理模式定义英文原话直译如何理解&#xff1f; 3个角色UML类图1. 抽象主题&#xff08;Subject&#xff09;角色2. 代理类&#xff1a;代理主题&#xff08;Proxy Subject&#xff0…

Google Earth Engine(GEE)深度学习入门教程-Python数据读入篇

Python数据读入篇 前置条件&#xff1a; GEE预处理影像导出保存为tfrecord的数据包&#xff0c;并下载到本地tensorflow的深度学习环境 本篇文章的目的主要是把Tfrecord格式的数据加载为tf可使用的数据集格式 设定超参数 首先需要设定导出时的波段名称和数据格式&#xff…

leetcode437 路径总和III-哈希表+前缀和

题目 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从父节点到子节…

nginx开启资源目录

nginx开启资源目录表 可访问开放资源目录下的任何文件以及视频&#xff0c;图片等。可以作为一个妥妥的线上网盘资源托管空间使用。 上一篇文档揭示了nginx的神秘面纱&#xff0c;初步介绍与启动了nginx的基本功能和使用前端nginx学习配置开发验证&#xff0c;对各种配置已经…

Flutter容器

内边距padding class MyBody extends StatelessWidget {overrideWidget build(BuildContext context) {return Container(//为了可以看出内边距&#xff0c;将容器设置成红色color: Colors.red,child: Padding(padding: EdgeInsets.all(15),child: MyImage(https://raw.github…

SpheroGPT: 声控自然语言编程 AI 玩具 Demo 具身智能 图文解说 完全开源机器人

背景介绍 因为生病请了长假. 一周前状态开始恢复, 于是尝试用 LLM (ChatGPT3.5) + Sphero 开发一个可以声控自然语言编程的 AI 玩具, 作为学习 ChatGPT 应用开发的方法. 差不多十天时间把开发目标基本都实现了, 这里和大家分享一下心得体会. Demo 示例视频 先把录制的几个 d…

企业软件商城:管理路径与价值的全面解析

在现代企业的运营中&#xff0c;软件资产管理&#xff08;SAM&#xff09;的实施不仅仅是为了应对审计需要&#xff0c;更重要的是其对于企业持续健康发展的深远影响。本文将详细探讨软件合规性管理的多重意义&#xff0c;并分析如何通过恰当的环境选择和高效系统&#xff0c;提…

WPS PPT学习笔记 1 排版4原则等基本技巧整理

排版原则 PPT的排版需要满足4原则&#xff1a;密性、对齐、重复和对比4个基本原则。 亲密性 彼此相关的元素应该靠近&#xff0c;成为一个视觉单位&#xff0c;减少混乱&#xff0c;形成清晰的结构。 两端对齐&#xff0c;1.5倍行距 在本例中&#xff0c;19年放左边&#x…

淄博公司商标驳回复审条件及流程

商标是人工审查的&#xff0c;所以不同的人会有不同的想法和意见&#xff0c;导致同一案件的审查结果不同。特别是商标审查周期缩短到5个月&#xff0c;全国平均每个工作日有1万多个商标提交申请&#xff0c;而全国只有一个商标审查单位——国家商标局提交申请。这种情况下&…

AI图书推荐:用100个ChatGPT提示词掌握Python编程

《用100个ChatGPT提示词掌握Python编程》&#xff08;ChatGPT:Your Python Coach Mastering the Essentials in 100 Prompts&#xff09; 塞尔吉奥罗哈斯-加莱亚诺&#xff08;Sergio Rojas-Galeano&#xff09;是一位热情的计算机科学家&#xff0c;对人工智能、机器学习、进化…

OceanBase数据库诊断调优,与高可用架构——【DBA从入门到实践】第八期

在学习了《DBA从入门到实践》的前几期课程后&#xff0c;大家对OceanBase的安装部署、日常运维、数据迁移以及业务开发等方面应当已经有了全面的认识。若在实际应用中遇到任何疑问或挑战&#xff0c;欢迎您在OceanBase社区问答论坛中交流、讨论。此次&#xff0c;《DBA从入门到…

在线投票系统源码 网上投票平台创建 安全稳定 支持自定义投票规则+礼物道具功能

分享一款在线投票系统源码&#xff0c;是一款功能丰富、安全稳定的网络投票平台解决方案。通过本源码&#xff0c;用户可以轻松创建并管理各种在线投票活动&#xff0c;支持自定义投票规则&#xff0c;同时集成礼物道具功能&#xff0c;增强用户参与度和投票活动的趣味性&#…

# 全面解剖 消息中间件 RocketMQ-(2)

全面解剖 消息中间件 RocketMQ-&#xff08;2&#xff09; 一、RocketMQ – RocketMQ 各角色介绍 1、RocketMQ 各角色介绍 Producer : 消息的发送者; 举例:发信者。Consumer : 消息接收者; 举例:收信者。Broker : 暂存和传输消息; 举例:邮局。NameServer : 管理 Broker; 举例…

数字人实训室解决方案

前言 近年来&#xff0c;政策层面的积极推动为数字人产业铺设了坚实的基石。2021年&#xff0c;“十四五”规划将虚拟数字技术纳入其中&#xff0c;强调技术创新引领行业应用的革新&#xff0c;加速数字人在各领域的实际应用。紧接着的《“十四五”数字经济发展规划》进一步明确…

CVE-2024-1561 Gradio component_server存在任意文件读取漏洞

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 Gradio是一个用于构建快速原型和部署机器学习模型的…

集成环境 ClassNotFound 分析与排查

项目场景&#xff1a; 最近项目在集成环境&#xff0c;经常会报 ClassNotFound 异常&#xff0c; 而在开发环境通过IDEA查看项目&#xff0c;类是不缺的 原因分析&#xff1a; 经过排查&#xff0c;发现是项目中引用的 API jar包更新了&#xff0c;但是集成环境却没有成功更…

ATA-2081高压放大器的结构组成及原理是什么

高压放大器是一种电子设备&#xff0c;用于将低电压信号增强到高电压水平&#xff0c;以满足特定应用的需求。它们在各种领域中都有广泛的用途&#xff0c;包括医学成像、科学研究、通信系统和声学应用。下面西安安泰电子来为大家介绍高压放大器的结构组成和工作原理。 高压放大…

kafka Kerberos集群环境部署验证

背景 公司需要对kafka环境进行安全验证,目前考虑到的方案有Kerberos和SSL和SASL_SSL,最终考虑到安全和功能的丰富度,我们最终选择了SASL_SSL方案。处于知识积累的角度,记录一下kafka keberos安装部署的步骤。 机器规划 目前测试环境公搭建了三台kafka主机服务,现在将详细…

国家开放大学Java语言程序设计实验2:分支、循环和跳转语句的使用

作业答案 联系QQ:1603277115 实验目的 通过本实验&#xff0c;了解和掌握分支、循环和跳转语句的使用及常见问题处理。 问题描述 杂物店正在做促销活动&#xff0c;很多商品都在进行特价促销&#xff0c;针对特价商品的购买数量做了限制&#xff0c;具体的促销办法是&#…

基于物理的AlGaN/GaN高电子迁移率晶体管的紧凑直流和交流模型

来源&#xff1a;A Physics-Based Compact Direct-Current and Alternating-Current Model for AlGaN/GaN High Electron obility Transistors&#xff08;中国物理快报 07年&#xff09; 摘要 一套针对 AlGaN/GaN 高电子迁移率晶体管 (HEMT) 的直流和小信号特性的分析模型被…