Vue全栈开发旅游网项目(10)-用户管理后端接口开发
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.headers.get('version','')source = request.headers.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_record(username=user.username,ip=ip,source=source,version=version)return user,profileexcept Exception as e:print(e)return None
3.视图函数
文件地址:accounts/views.py
class UserRegisterView(FormView):#用户注册接口form_class = RegisterForm #表单验证类http_method_names = ['post'] #请求方式def form_valid(self, form):#验证通过result = form.do_register(request=self.request)#调用注册函数,完成注册步骤if result is not None:#合成响应数据user,profile = resultdata = {'user':serializers.UserSerializers(user).to_dict(),'profile':serializers.UserProfileSerializers(profile).to_dict()}#响应数据数据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.配置路由
文件地址:accounts/urls.py
from django.urls import path
from system import views
urlpatterns= [path('user/api/register/',views.UserRegisterView.as_view(),name='user_api_register')
]
相关文章:

Vue全栈开发旅游网项目(10)-用户管理后端接口开发
1.异步用户登录\登出接口开发 1.设计公共响应数据类型 文件地址:utils/response404.py from django.http import JsonResponseclass BadRequestJsonResponse(JsonResponse):status_code 400def __init__(self, err_list, *args, **kwargs):data {"error_c…...

[Android]查找java类中声明为native方法的具体实现方法
在android代码中,经常可以看到native方法,需要查看其对应的C方法,这些方法是一一对应的,对应关系是在jni注册里关联起来的。 比较直观的是这样的例子, Parcel.java //Java层的方法里调用了native方法nativeWriteInt…...

Exploring Defeasible Reasoning in Large Language Models: A Chain-of-Thought A
文章目录 题目摘要简介准备工作数据集生成方法实验结论 题目 探索大型语言模型中的可废止推理:思路链 论文地址:http://collegepublications.co.uk/downloads/LNGAI00004.pdf#page136 摘要 许多大型语言模型 (LLM) 经过大量高质量数据语料库的训练&…...

uniapp在app模式下组件传值
在 UniApp 编译成 App 后,传递参数可以通过多种方式实现,常见的方式有以下几种: 1. 通过 URL 参数传递(适用于 WebView) 如果你的 App 页面通过 WebView 渲染,可以像在 Web 端一样通过 URL 传递参数。例如…...

Docker解决暴露2375端口引发的安全漏洞
docker的暴露api端口2375,没有任何安全防护,我们通过linux系统防火墙(iptables)来进行ip访问限制 # 查看iptables所有规则 iptables -L -nv # 只允许某个ip访问2375端口 iptables -I INPUT -s 127.0.0.1 -p tcp --dport 2375 -j A…...

HTML5+CSS前端开发【保姆级教学】+新闻文章初体验
Hello,各位编程猿们!上一篇文章介绍了前端以及软件的安装,这一篇我们要继续讲解页面更多知识点,教大家做一篇新闻题材的文章 新闻文章 当我们点开浏览器经常看到各种各样的文章,今天我们就来看看大家最喜欢关注的体育…...

『VUE』26. props实现子组件传递数据给父组件(详细图文注释)
目录 本节内容示例代码总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 本节内容 父组件传子组件–props 子组件传父组件–自定义事件 本节讲子组件传父组件–通过props里的方法传递,就是父亲写了一个函数,给子组件调用,然后…...

RHCE-DNS域名解析服务器
一、DNS简介 DNS ( Domain Name System )是互联网上的一项服务,它作为将域名和 IP 地址相互映射的一个分布式 数据库,能够使人更方便的访问互联网。 DNS 系统使用的是网络的查询,那么自然需要有监听的 port 。 DNS 使…...

移民统计年鉴(1996-2021年)
年鉴中包含了以下几个方面的数据: 移民数量:记录了每年全球移民的总数,以及不同国家和地区的移民流入和流出情况。 移民类型:区分了经济移民、难民、家庭团聚等不同类型的移民。 移民原因:分析了推动移民的各种因素&…...

MFC1(note)
引言 在学习SDK后我们发现,写消息好麻烦,处理消息更麻烦 处理消息效率低发送消息效率低 所以把SDK中这些消息全部封装好 MFC封装了windows 的大部分API 这里说一下QT架构跨平台 MFC用得如何取决于你SDK的水平 创建 如果打开没有MFC 一般勾选以下…...

1.1 关于游戏编程
1.1.1、游戏中客户端和服务器的交互 游戏通常采用客户端-服务器模式。在这种模式下,服务器负责处理游戏的核心逻辑、数据存储和玩家间的交互,而客户端则负责呈现游戏画面、接收玩家输入并与服务器通信。 客户端和服务器的作用和功能 客户端&a…...

光流法与直接法在SLAM中的应用
本文总结视觉SLAM中常用的光流法与直接法 1、Lucas-Kanade光流法 相机所拍摄到的图像随相机视角的变化而变化,这种变化也可以理解为图像中像素的反向移动。“光流”(Optical Flow)是指通过分析连续图像帧来估计场景中像素或特征点的运动的技…...

C++模板特化实战:在使用开源库boost::geometry::index::rtree时,用特化来让其支持自己的数据类型
用自己定义的数据结构作为rtree的key。 // rTree的key struct OverlapKey {using BDPoint boost::geometry::model::point<double, 3, boost::geometry::cs::cartesian>; //双精度的点using MyRTree boost::geometry::index::rtree<OverlapKey, boost::geometry::in…...

让空间计算触手可及,VR手套何以点石成金?
引言 如何让一位母亲与她去世的小女儿“重逢”?韩国MBC电视台《I Met You》节目实现了一个“不可能”心愿。 在空旷的绿幕中,母亲Jang Ji-sung透过VR头显,看到了三年前因白血病去世的女儿Nayeon。当她伸出双手,居然能摸到女儿的…...

穿越数据迷宫:C++哈希表的奇幻旅程
文章目录 前言📔一、unordered系列关联式容器📕1.1 unordered 容器概述📕1.2 哈希表在 unordered 容器中的实现原理📕1.3 unordered 容器的特点 📔二、unordered_set 和 unordered_map 的基本操作📕2.1 un…...

SMT32 智能环境监测系统 嵌入式初学者课堂小组作业
一、应用知识 1,开发语言:C语言 2,开发工具:Keil uVision5、Setup_JLinkARM_V415e 3,开发平台:XCOM V2.0 4,开发知识:温湿度传感DHT11、STM32F4xx中文参考手册 5,文…...

20241114给荣品PRO-RK3566开发板刷Rockchip原厂的Android13下适配RJ45以太网卡
20241114给荣品PRO-RK3566开发板刷Rockchip原厂的Android13下适配RJ45以太网卡 2024/11/14 15:44 缘起:使用EVB2的方案,RJ45加进去怎么也不通。 实在没有办法,只能将荣品的SDK:rk-android13-20240713.tgz 解压缩,编译之…...

JVM这个工具的使用方法
JVM(Java虚拟机)是Java程序运行的基础环境,它提供了内存管理、线程管理和性能监控等功能。吃透JVM诊断方法,可以帮助开发者更有效地解决Java应用在运行时遇到的问题。以下是一些常见的JVM诊断方法: 使用JConsole: JCon…...

创建型设计模式与面向接口编程
创建型设计模式(Creational Patterns)的主要目的之一就是帮助实现面向接口编程,避免直接创建实现类的实例。通过这些模式,可以将对象的创建过程封装起来,使得客户端代码不需要知道具体的实现类,从而提高代码…...

算法每日双题精讲——滑动窗口(长度最小的子数组,无重复字符的最长子串)
🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧!💪…...

1.7 JS性能优化
从输入url到页面加载完成都做了些什么 输入 URL - 资源定位符 http://www.zhaowa.com - http 协议 域名解析 https://www.zhaowa.com > ip 1. 切HOST? > 浏览器缓存映射、系统、路由、运营商、根服务器 2. 实际的静态文件存放? 大流量 > 多个…...

STL - vector的使用和模拟实现
目录 一:vector的构造函数 二:vector的迭代器 三vector的空间增长问题 四:vector 增删查改接口 五:vector的模拟实现 (一)一些简单接口的实现: (二)一些复杂接口的…...

《鸿蒙生态:开发者的机遇与挑战》
一、引言 在当今科技飞速发展的时代,操作系统作为连接硬件与软件的核心枢纽,其重要性不言而喻。鸿蒙系统的出现,为开发者带来了新的机遇与挑战。本文将从开发者的角度出发,阐述对鸿蒙生态的认知和了解,分析鸿蒙生态的…...

【C++融会贯通】二叉树进阶
目录 一、内容说明 二、二叉搜索树 2.1 二叉搜索树概念 2.2 二叉搜索树操作 2.2.1 二叉搜索树的查找 2.2.2 二叉搜索树的插入 2.2.3 二叉搜索树的删除 2.3 二叉搜索树的实现 2.3.1 二叉搜索树的节点设置 2.3.2 二叉搜索树的查找函数 2.3.2.1 非递归实现 2.3.2.2 递…...

使用python-Spark使用的场景案例具体代码分析
使用场景 1. 数据批处理 • 日志分析:互联网公司每天会产生海量的服务器日志,如访问日志、应用程序日志等。Spark可以高效地读取这些日志文件,对数据进行清洗(例如去除无效记录、解析日志格式)、转换(例如…...

如何查看本地的个人SSH密钥
1.确保你的电脑上安装了 Git。 你可以通过终端或命令提示符输入以下命令来检查: git --version 如果没有安装,请前往 Git 官网 下载并安装适合你操作系统的版本。 2.查找SSH密钥 默认情况下,SSH密钥存储在你的用户目录下的.ssh文件夹中。…...

本人认为 写程序的三大基本原则
1. 合法性 定义:合法性指的是程序必须遵守法律法规和道德规范,不得用于非法活动。 建议: 了解法律法规:在编写程序之前,了解并遵守所在国家或地区的法律法规,特别是与数据隐私、版权、网络安…...

A030-基于Spring boot的公司资产网站设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…...

React Hooks 深度解析与实战
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 React Hooks 深度解析与实战 React Hooks 深度解析与实战 React Hooks 深度解析与实战 引言 什么是 Hooks? 定义 为什么需要 Ho…...

#渗透测试#SRC漏洞挖掘#蓝队基础之网络七层杀伤链04 终章
网络杀伤链模型(Kill Chain Model)是一种用于描述和分析网络攻击各个阶段的框架。这个模型最初由洛克希德马丁公司提出,用于帮助企业和组织识别和防御网络攻击。网络杀伤链模型将网络攻击过程分解为多个阶段,每个阶段都有特定的活…...