使用Django Rest Framework设计与实现用户注册API

使用Django Rest Framework设计与实现用户注册API

在现代Web应用开发中,RESTful API已成为前后端分离架构中的关键组件。Django Rest Framework (DRF) 是一款基于Django的优秀库,提供了丰富的工具和接口,极大地简化了RESTful API的设计与实现。本文将以用户注册功能为例,展示如何运用DRF构建一个完整的API端点,包括数据验证、模型操作、序列化处理以及路由配置等环节。

一、项目结构与依赖

首先,确保你的Django项目已安装Django Rest Framework:

pip install djangorestframework

接下来,在项目的api应用下创建以下文件:

  • views.py: 存放视图类。
  • models.py: 定义用户模型。
  • serializers.py: 实现序列化器类。
  • urls.py: 配置URL路由。

二、定义用户模型(models.py)

models.py中,我们创建一个名为UserInfos的模型来存储用户信息:

from django.db import modelsclass UserInfos(models.Model):username = models.CharField(max_length=32, verbose_name="用户名", db_index=True)email = models.EmailField(max_length=254, verbose_name="邮箱")password = models.CharField(max_length=64, verbose_name="密码")token = models.CharField(max_length=64, verbose_name="token", null=True, blank=True, db_index=True)

此模型包含四个字段:username(用户名)、email(邮箱)、password(密码)和token(用于身份验证的令牌)。每个字段都指定了相应的数据类型、长度限制及元信息,如是否创建索引。

三、设计序列化器(serializers.py)

序列化器负责将请求数据转化为可被模型接受的格式,并将模型对象转化为响应数据。在serializers.py中,我们创建RegisterSerializers继承自serializers.ModelSerializer

from rest_framework import serializers
from .models import UserInfosclass RegisterSerializers(serializers.ModelSerializer):confirm_password = serializers.CharField(write_only=True)class Meta:model = UserInfosfields = ['id', 'username', 'email', 'password', 'confirm_password']extra_kwargs = {'id': {'read_only': True},'password': {'write_only': True,'style': {'input_type': 'password'}}}def validate_password(self, value):md5_hash = md5(value)  # 注意:此处使用MD5加密并不安全,实际应用中应使用更强的密码哈希算法return md5_hashdef validate_confirm_password(self, value):password = self.initial_data.get('password')if password and password != value:raise serializers.ValidationError('两次输入的密码不一致')return value

RegisterSerializers中:

  • confirm_password字段标记为write_only=True,表示只在注册时接收确认密码,不在响应中返回。
  • Meta类内定义了关联的模型、需要序列化的字段及额外属性。id字段设为只读,password字段同样为只写且在前端表现为密码输入框。
  • 自定义validate_password方法对密码进行MD5哈希处理(注:实际应用中应使用更安全的密码哈希算法如bcrypt或Argon2)。
  • validate_confirm_password方法验证确认密码与原始密码的一致性。

四、实现注册视图(views.py)

views.py中,我们使用APIView作为基础类,创建UserRegister视图处理用户注册请求:

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import UserInfos
from .serializers import RegisterSerializersclass UserRegister(APIView):def post(self, request):ser = RegisterSerializers(data=request.data)if not ser.is_valid():return Response({"status": status.HTTP_400_BAD_REQUEST, "message": "用户注册失败", "details": ser.errors})email = ser.validated_data['email']if UserInfos.objects.filter(email=email).exists():ser._errors['email'] = ['该邮箱已存在,请使用其他邮箱进行注册']return Response({"status": status.HTTP_400_BAD_REQUEST, "message": "用户注册失败", "details": ser.errors})ser.validated_data.pop('confirm_password')  # 移除确认密码,因为模型中不需要此字段ser.save()  # 保存用户信息到数据库return Response({"status": status.HTTP_201_CREATED, 'message': '用户注册成功', "details": ser.data})

此视图处理POST请求,主要步骤如下:

  1. 创建RegisterSerializers实例并传入请求数据。
  2. 使用is_valid()方法进行数据验证,若验证失败则返回400状态码及错误详情。
  3. 检查邮箱是否已存在于数据库中,如果存在,则添加错误信息至序列化器并返回400状态码及错误详情。
  4. 若邮箱未重复,移除确认密码字段,保存用户信息至数据库。
  5. 注册成功后,返回201状态码、成功消息及新创建用户的详细信息。

五、配置URL路由(urls.py)

最后,在urls.py中设置路由,将UserRegister视图与特定URL关联:

from django.urls import path, include
from .views import UserRegisterurlpatterns = [path("user/register/", UserRegister.as_view(), name="user_register"),
]

至此,我们已经完成了用户注册API的设计与实现。当客户端向/user/register/发送POST请求,携带符合要求的JSON数据时,服务器将处理该请求,完成用户注册逻辑,并返回相应的HTTP响应。

总结来说,利用Django Rest Framework构建用户注册API涉及模型定义、序列化器设计、视图编写及URL路由配置等多个环节。DRF提供的强大工具集简化了这些过程,使得开发者能够高效地创建出结构清晰、易于维护的RESTful API。在实际应用中,还可以进一步扩展此API,例如添加身份验证、密码重置等功能,以满足更多业务需求。

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

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

相关文章

Oracle和SQL Server区别

首先,从操作的平台来看,Oracle具有更高的灵活性,它可以在所有主流平台上运行,并采用了开放的策略目标,使得客户可以选择最适合他们特定需要的解决方案。这意味着客户可以利用很多种第三方应用程序和工具。相比之下&…

Matlab|【免费】【sci】考虑不同充电需求的电动汽车有序充电调度方法

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现sci文献《A coordinated charging scheduling method for electric vehicles considering different charging demands》,主要实现电动汽车协调充电调度方法,该方法主要有以…

Python3:读取和处理超大文件

在日常工作中,文件对象是我们常接触到的可迭代类型之一。一般用 for 循环遍历一个文件对象,可以逐行读取它的内容。但这种方式在碰到大文件时,可能会出现一些奇怪的效率问题。 需求: 小明是一位 Python 初学者,在学习…

Flask + Bootstrap vs Flask + React/Vue:初学者指南

在这篇博客文章中,我们将比较 Flask Bootstrap 和 Flask React/Vue 这两种技术栈,以帮助初学者了解哪种组合更适合他们的项目需求。我们将从学习曲线、易用性、依赖管理、构建部署和路由定义等方面进行比较。 学习曲线 Flask 是一个基于 Python 的轻…

【Unity】申请D-U-N-S邓氏编码流程

标题 在使用苹果开发者账号的时候,我们需要用到D-U-N-S邓氏编码,那如何申请呢?最近正好帮朋友申请了一个,接下来我来演示一下申请流程。 1.登录苹果开发者账号 登录连接:Apple Developer 没有账号的自己注册一个 2…

安装Git并设置用户信息

安装Git并设置用户信息的过程如下: 安装Git 在Windows系统上: 访问官方Git下载页面:Git - Downloading Package下载适用于Windows系统的安装程序(.exe文件)。运行安装程序,按照向导进行安装,…

Python-VBA函数之旅-format函数

目录 一、format函数的常见应用场景: 二、format函数的语法结构: 1、format函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页:https://blog.csdn.net/ygb_1024?spm1010.2135.…

【OceanBase诊断调优 】—— 建索引执行报错问题排查

背景 建索引可能因各种各样的原因产生报错,本文主要介绍碰到建索引报错时,如何定位到建索引报错的日志,方便后续进一步使用工具一键收集日志/根因分析,分析根本原因。 备注:此文档中涉及的语句适用于版本号>4.2.3…

vivo怎么录屏?玩转手机新体验!(2024最新)

“最近新入手了一款vivo手机,感觉用起来真的很顺手,各种功能都很强大。昨天和朋友一起打游戏,突然想到要记录下精彩瞬间,但是找遍了手机,都没有找到录屏功能。我想请教一下各位vivo手机用户,你们通常在哪里…

深入剖析Tomcat(三) 实现一个简易连接器

Tomcat中的servlet容器叫做Catalina,Catalina有两个主要模块:连接器与容器。在本章,将会建立一个连接器来增强第二章中应用程序的功能,用一种更好的方式来创建request与response对象。 截止文章编写日期,servlet规范已…

ES Master 和data节点分别的职责

目录 Elasticsearch Master 节点 职责 特点 Elasticsearch Data 节点 职责 特点 通俗解释 Elasticsearch Master 节点 职责 集群管理: Master 节点负责整个集群的管理工作,包括集群的配置和控制。元数据管理: 维护集群的状态,包括索引的创建、删…

网络流的C++代码实现与过程讲解

网络流是一种非常重要的图论算法,它在许多实际问题中得到广泛应用。本文将介绍网络流算法的C++代码实现与过程讲解。 算法概述 网络流算法是通过将图中的边看作流量通道,将图的点看作流量的起点或终点,来求解图中的最大或最小流量的问题。它是一种非常重要的最优化算法,广…

DM数据库一次redo日志损坏修复的经历

1 缘由 服务器意外断电了,重新上电后发现DM数据库不能连接,提示网络通信异常,数据库拒绝连接。通过服务查看器发现数据库服务停止,并且手动启动失败,codeexited,status1/failure。 2 问题排查 网上查资料说…

Python教学入门:列表与元组

列表(Lists): 定义: 列表是 Python 中最常用的数据类型之一,用于存储一组有序的元素。列表使用方括号 [] 定义,元素之间用逗号 , 分隔。 特点: 列表是可变的(Mutable)…

WebSocket发送与接收数据

创建websocket对象,参数为服务器websockets地址: websocket new WebSocket("ws:127.0.0.1:7001"); 1、发送文本数据 websocket.send(我太笨了,不知道你说的是啥) 2、发送对象数据 发送对象的话需要通过 JSON.parse() 和JSON.…

Java梳理

梳理 1.ResponseBody return “hello world!” 当需要返回一个值的时候,需要使用到ResponseBody RestControllerControllerResponseBody 1.1没有Controller就不能写 GetMapping("/hello") public String sayHello() { return "Hello, wor…

HQL,SQL刷题,尚硅谷(中级)

目录 相关表结构: 1、order_info表 2、order_detail表 题目及思路解析: 第一题,查询各品类销售商品的种类数及销量最高的商品 第二题 查询用户的累计消费金额及VIP等级 第三题 查询首次下单后第二天连续下单的用户比率 总结归纳&#xff1a…

【双指针】

目录 1. LeetCode 283. 移动零 1.1 题目描述 1.2 题目思路 1.3 实现代码 2. LeetCode 1089. 复写零 2.1 题目描述 2.2 题目思路 2.3 实现代码 3. LeetCode 202. 快乐数 3.1 题目描述 3.2 题目思路 3.3 实现代码 4. LeetCode 11. 盛水最多的容器 4.1 题目描述 …

Debian12 中重新安装MSSQL 并指定服务器、数据库、数据表字段的字符排序规则和默认语言等参数

在 Linux 上配置 SQL Server 设置 - SQL Server | Microsoft Learn 零、查看sql server 服务器支持的字符排序规则 SELECT Name from sys.fn_helpcollations() where name Like Chinese% go------ Chinese_PRC_CI_AI Chinese_PRC_CI_AI_WS Chinese_PRC_CI_AI_KS Chinese_PRC_…

CV 面试指南—深度学习知识点总结(3)

本期专栏文章: CV 面试指南—深度学习知识点总结(1)CV 面试指南—深度学习知识点总结(2)CV 面试指南—深度学习知识点总结(3)CV 面试指南—深度学习知识点总结(4)CV 面试指南—深度学习知识点总结(5)