基于python和Django的用户管理接口开发

1.异步用户登录\登出接口开发

1.设计公共响应数据类型

文件地址:utils/response404.py

from django.http import JsonResponseclass BadRequestJsonResponse(JsonResponse):status_code = 400def __init__(self, err_list, *args, **kwargs):data = {"error_code":"400000","error_msg":"参数格式不正确","error_list":err_list}super().__init__(data,*args, **kwargs)class MethodNotAllJsonResponse(JsonResponse):status_code = 405def __init__(self, err_list, *args, **kwargs):data = {"error_code":"405000","error_msg":"请求方式不被允许","error_list":err_list}super().__init__(data,*args, **kwargs)

2.设计accounts响应数据结构

新建文件:system/serializers.py

from utils.serializers import BaseSerializer
#返回用户基本信息
class UserSerializers(BaseSerializer):#重写父类to_dict函数def to_dict(self):user = self.objreturn {'nickname': user.nickname,'avatar': user.avatar.url}
#返回用户详细信息
class UserProfileSerializers(BaseSerializer):#重写父类to_dict函数def to_dict(self):profile = self.objreturn {'real_name': profile.real_name,'sex':profile.sex,'sex_display':profile.get_sex_display()}

3.视图函数-服务端的处理过程

文件地址:accounts/views.py

def user_api_login(request):#确定请求方式if request.method == 'POST':#表单验证form = LoginForm(request.POST)#通过验证,则执行登录if form.is_valid():# 返回内容是登录用户的信息user = form.do_login(request)#获得用户详细信息profile = user.profile#合成返回数据data = {'user':serializers.UserSerializers(user).to_dict(),'profile':serializers.UserProfileSerializers(profile).to_dict()}return http.JsonResponse(data)else:#没有通过表单验证,返回错误信息err = json.load(form.errors.as_json())return BadRequestJsonResponse(err)else:#没有请求方式return MethodNotAllJsonResponse([{"detail": "Method not allowed. Only POST is allowed."}])def user_api_logout(request):logout(request)return http.HttpResponse(status=201)

4.配置路由地址

文件地址:accounts/urls.py

from django.urls import path
from accounts import views
urlpatterns = [#用户登录(异步提交)path('user/api/login/',views.user_api_login,name='user_api_login'),#用户登出(异步提交)path('user/api/logout/',views.user_api_logout,name='user_api_logout')
]

2.用户详情接口开发

1.设计公共响应数据类型

文件地址:utils/response404.py

class UnauthorizedJsonResponse(JsonResponse):status_code = 401def __init__(self, *args, **kwargs):data = {"error_code":"401000","error_msg":"请登录",}super().__init__(data,*args, **kwargs)

2.视图函数-服务端的处理过程

文件地址:accounts/views.py

class UserDetailView(View):#用户详情接口def get(self, request):#获取用户信息user = request.user#判断用户状态是登录还是未登录if not user.is_authenticated:#未登录状态返回‘401’状态码return UnauthorizedJsonResponse()else:#返回详细信息profile = user.profiledata = {'user':serializers.UserSerializers(user).to_dict(),'profile':serializers.UserProfileSerializers(profile).to_dict()}return http.JsonResponse(data)#向客户端浏览器中响应数据

3.配置路由地址

文件地址:accounts/urls.py

from django.urls import path
from accounts import views
urlpatterns = [path('user/api/info/',views.UserDetailView.as_view(),name='user_api_info')
]

3.短信验证接口开发

1.设计公共响应数据类型

文件地址:utils/response404.py

class ServerErrorJsonResponse(JsonResponse):status_code = 500def __init__(self, *args, **kwargs):data = {"error_code":"500000","error_msg":"服务端正忙,请稍后再试",}super().__init__(data,*args, **kwargs)

2.验证码表单发送

新建文件:system/forms.py

import random
import re
from django import forms
from django.core.cache import cache
from pymongo import timeoutclass SendSmsCodeForm(forms.Form):#发送验证码phone_num = forms.CharField(label='手机号码',required=True,error_messages={'required':'请输入手机号码'})def clean_phone_num(self):#验证是否为手机号码phone_num = self.cleaned_data['phone_num']pattern = r'^1[0-9]{10}$'if not re.search(pattern, phone_num):raise forms.ValidationError('手机号码%s输入不正确',code='invalid_phone',params=(phone_num,))return phone_numdef send_sms_code(self):#生成验证码并发送sms_code = random.randint(100000,999999)phone_num = self.cleaned_data.get('phone_num',None)try:#将验证码存在radis中# key = 'sms_code_{}'.format(phone_num)time_out = 5*60# cache.set(key,sms_code,time_out)return {'phone_num': phone_num,'sms_code': sms_code,'time_out': time_out}except Exception as e:print(e)return None

3.系统视图函数

文件地址:system/views.py

class SmsCodeView(FormView):form_class = SendSmsCodeFormdef form_valid(self, form):#表单通过验证,生成并获得验证码data = form.send_sms_code()if data is not None:return http.JsonResponse(data,status=201)return ServerErrorJsonResponse()def form_invalid(self, form):#表单未通过验证err_list = json.loads(form.errors.as_json())return BadRequestJsonResponse(err_list)

4.配置路由

文件地址:system/urls.py

from django.urls import path
from system import views
urlpatterns= [path('send/sms/',views.SmsCodeView.as_view(),name='send_sms')
]

5.效果图示

4.注册用户

1.登录日志&装饰器

文件地址:accounts/models.py

class User(AbstractUser):avatar = models.ImageField("头像", null=True, upload_to="avatar/%Y%m")nickname = models.CharField("昵称", max_length=32, unique=True)class Meta:db_table = "account_user"👇def add_login_record(self, **kwargs):#写入日志,保存登入历史【把传入的参数kwargs,创建在日志中】。self.login_records.create(**kwargs)@propertydef avatar_url(self):return self.avatar.url if self.avatar else ''👆

 文件地址:accounts/serializers.py

2.注册表单

文件地址:accounts/forms.py

 这段代码定义了一个 Django 注册表单类:

用于验证用户输入的手机号码、密码、昵称和验证码,

并在验证通过后执行用户注册流程,包括创建用户、登录和记录登录信息。

class RegisterForm(forms.Form):#用户名username = forms.CharField(label='手机号码',max_length=16,required=True,error_messages={'required':'请输入手机号码'})# 密码password = forms.CharField(label='密码',max_length=128,required=True,error_messages={'required':'请输入密码'})# 昵称nickname = forms.CharField(label='昵称',max_length=16,required=True,error_messages={'required':'请输入昵称'})# 验证码sms_code = forms.CharField(label='验证码',max_length=6,required=True,error_messages={'required':'请输入验证码'})def clean_username(self):#验证用户名username = self.cleaned_data['username']pattern = r'^1[0-9]{10}$'if not re.search(pattern,username):raise forms.ValidationError('手机号码%s输入不正确',code='invalid_phone',params=(username,))#利用数据模型对用户内容进行验证if User.objects.filter(username=username).exists():raise forms.ValidationError('手机号码已被使用')return usernamedef clean_nickname(self):#验证昵称nickname = self.cleaned_data['nickname']if User.objects.filter(nickname=nickname).exists():raise forms.ValidationError('昵称已被使用')return nickname#【数据获取】def clean(self):data = super().clean()if self.errors:returnphone_num = self.cleaned_data.get('username',None)sms_code = self.cleaned_data.get('sms_code', None)#注册验证码存入redis中return datadef do_register(self,request):#执行注册data = self.cleaned_dataversion = request.header.get('version','')source = request.header.get('source','')try:#1.写入基础信息user = User.objects.create_user(username=data.get('username', None),password=data.get('password', None),nickname=data.get('nickname', None))#2.写入详细信息profile = Profile.objects.create(user = user,username = user.username,version = version,source = source,)#3.登录login(request, user)#4.获取最后登录时间user.last_login = now()# 保存数据user.save()#获得IP地址ip = request.META.get('REMOTE_ADDR', '')# 4.写入日志user.add_login_ip(username=user.username,ip=ip,source=source,version=version)return user,profileexcept Exception as e:print(e)return None

3.视图函数

4.配置路由

see you tomorrow!

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

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

相关文章

Docker--Docker是什么和对Docker的了解

Docker 的本质 Docker的本质是LXC(Linux容器)之类的增强版,它本身不是容器,而是容器的易用工具。 Docker通过虚拟化技术,将代码、依赖项和运行环境打包成一个容器,并利用隔离机制来使得容器之间互相独立、…

Window下PHP安装最新sg11(php5.3-php8.3)

链接: https://pan.baidu.com/s/10yyqTJdwH_oQJnQtWcwIeA 提取码: qz8y 复制这段内容后打开百度网盘手机App,操作更方便哦 (链接失效联系L88467872) 1.下载后解压文件,将对应版本的ixed.xx.win文件放进php对应的ext目录下,如图所示 2.修改ph…

C# yolo10使用onnx推理

一、前言 本篇总结C#端使用yolo10的onnx文件做模型推理,主要使用Microsoft.ML.OnnxRuntime.Gpu这个库。需要注意的是Microsoft.ML.OnnxRuntime 和 Microsoft.ML.OnnxRuntime.Gpu 这2库只装1个就行,CPU就装前者,反之后者。然后需要注意系统安装…

MNIST数据集下载与保存为图片格式

深度学习 文章目录 深度学习下载数据集 下载数据集 https://github.com/geektutu/tensorflow-tutorial-samples/tree/master/mnist/data_set t10k-images-idx3-ubyte.gz t10k-labels-idx1-ubyte.gz train-images-idx3-ubyte.gz train-labels-idx1-ubyte.gz 解压后,…

Oracle In子句

Oracle IN 运算符可以用来确定值是否与列表或子查询中的任何值相匹配 Oracle IN语法: 确定表达式是否与值列表匹配的 Oracle IN 运算符的语法如下所示: expression [NOT] IN (v1,v2,...)并且表达式的语法与子查询匹配: expression [NOT] I…

华为OD机试 - 查找舆情热词(Python/JS/C/C++ 2024 C卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

从容应对蓝屏:必知原因与对策

电脑蓝屏,即“蓝屏死机”或“蓝屏错误”,是计算机用户在日常使用中可能遇到的一种较为严重的系统错误状态。当屏幕突然变成蓝色,并显示错误代码和信息时,这通常意味着系统遇到了无法处理的问题,了解电脑蓝屏的原因及解…

每日小练:Day1

1.牛牛冲钻五 题目链接:A-牛牛冲钻五_牛客小白月赛38 题目描述: 代码如下: import java.util.*;public class Main{public static void main(String[] args){Scanner scannernew Scanner(System.in);int tscanner.nextInt();while(t--!0){…

springboot汽车租赁智慧管理-计算机设计毕业源码96317

目 录 第 1 章 引 言 1.1 选题背景 1.2 研究现状 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析 2.3 系统性需求分析…

从社交媒体到元宇宙:Facebook未来发展新方向

Facebook,作为全球最大的社交媒体平台之一,已经从最初的简单互动工具发展成为一个跨越多个领域的科技巨头。无论是连接人与人之间的社交纽带,还是利用大数据、人工智能等技术为用户提供个性化的体验,Facebook一直引领着社交网络的…

用Python比较对象,你还在用==?

包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】! 1.基础比较: 和 is 在Python中,对象间的比较是程序设计中的基础且重要的一环,它直接关系到数据处理的逻辑和效率。本章将深入探讨两种基本的比较操…

MySQL 中的集群部署方案

文章目录 MySQL 中的集群部署方案MySQL ReplicationMySQL Group ReplicationInnoDB ClusterInnoDB ClusterSetInnoDB ReplicaSetMMMMHAGalera ClusterMySQL ClusterMySQL Fabric 总结参考 MySQL 中的集群部署方案 MySQL Replication MySQL Replication 是官方提供的主从同步方…

Vision Pro空间叙事创作工具:开启多媒体融合新纪元

在数字内容创作领域迎来了一位新玩家——专为Apple Vision Pro设计的空间叙事创作工具。这款工具不仅是一个沉浸式内容分享平台,更是面向空间计算时代的内容创作解决方案,它旨在通过全新的多媒体融合方式,打破传统内容创作的界限。 产品优势…

屏幕水印是什么,怎么设置丨超级简单的防盗水印教程来了,包教包会!

小李:现在科技这么发达,随便一截图或者拍照,信息就满天飞了 小张:给你的电脑屏幕安排一件“隐形战衣”呗 小李:哦?新词儿?些许陌生 小张:简而言之,言而简之&#xff0…

css:没错又是我

背景 给元素添加背景样式 还可以设置背景颜色、背景图片(教练我要学这个)、背景平铺、背景图片位置、背景图像固定 背景颜色 这个我们用过,就是: a {background-color: hotpink; } 一般默认值是transparent,也就…

adb 如何通过wifi连接手机

1. 电脑通过USB线连接手机 1.1手机开启开发者模式 以小米手机为例:连续点击OS版本系统(设置–>我的设备–>全部参数) 1.2在开发者模式下,启动允许USB安装与USB调试 操作步骤:设置>更多设置>开发者选项&g…

自己开发得期货资管模拟软件演示1.0.15版仅供学习

期货资管模拟软件演示1.0.15版仅供学习——C技术栈知识分享 本文将以期货资管模拟软件演示1.0.15版为例,分享其基于C技术栈的框架知识。 一、C技术栈在期货交易软件开发中的应用 C作为一种高性能的编程语言,以其强大的内存管理能力和高效的执行速度&a…

浅谈单片机的gcc优化级别__以双音频信号发生器为例

IDE: CLion HOST: Windows 11 MinGW:x86_64-14.2.0-release-posix-seh-ucrt-rt_v12-rev0 GCC: arm-gnu-toolchain-13.3.rel1-mingw-w64-i686-arm-none-eabi 一、简介 gcc有多种优化级别,一般不选择的情况下&#x…

C++之继承多态

C之继承&多态 继承继承之形继承的作用域继承的构造与析构多继承菱形继承 多态多态之形final和override(C11)纯虚函数&抽象类多态的原理打印虚表(在vs2022中)多继承下的虚表菱形虚继承中埋的坑静态多态与动态多态我对虚函数和普通成员函数调用区别…

机器学习-36-对ML的思考之机器学习研究的初衷及科学研究的期望

文章目录 1 机器学习最初的样子1.1 知识工程诞生(专家系统)1.2 知识工程高潮期1.3 专家系统的瓶颈(知识获取)1.4 机器学习研究的初衷2 科学研究对机器学习的期望2.1 面向科学研究的机器学习轮廓2.2 机器学习及其应用研讨会2.3 智能信息处理系列研讨会2.4 机器学习对科学研究的重…