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')
]

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

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

相关文章

数据结构:队列

目录 概念与结构底层结构的选择队列的实现队列头文件(queue.h)队列初始化队列的销毁入队列检查队列是否为空出队列查询队列第一个数据查询队列末尾数据查询队列有效数据个数代码试运行 概念与结构 概念:只允许在⼀端进行插⼊数据操作&#x…

Clickhouse集群新建用户、授权以及remote权限问题

新建用户 create user if not exists user on cluster 集群名称 IDENTIFIED WITH plaintext_password BY 密码;给用户授查询、建表、删表的权限 GRANT create table,select,drop table ON 数据库实例.* TO user on cluster 集群名称 ;再其他节点下用户建本地表成功&#…

JavaWeb--MySQL

1. MySQL概述 首先来了解一下什么是数据库。 数据库:英文为 DataBase,简称DB,它是存储和管理数据的仓库。 像我们日常访问的电商网站京东,企业内部的管理系统OA、ERP、CRM这类的系统,以及大家每天都会刷的头条、抖音…

i春秋-SQLi(无逗号sql注入,-- -注释)

练习平台地址 竞赛中心 题目描述 后台有获取flag的线索应该是让我们检查源码找到后台 题目内容 空白一片 F12检查源码 发现login.php 访问login.php?id1 F12没有提示尝试sql注入 常规sql注入 //联合注入得到表格列数 1 order by 3 # 1 union select 1,2,3 #&#xff08…

基于Spring Boot的电子商务平台架构

2 相关技术 2.1 SpringBoot框架介绍 Spring Boot是一种不需要代码生成的一种框架,并且可以不需要配置任何的XML文件就可以,因为Spring Boot里面自带了很多接口,只需要配置不同的接口就会自动的应用并且识别需要的依赖,在配置方面非…

华为云分布式缓存服务(DCS)专家深度解析Valkey,助力openEuler峰会

在数字化时代,开源技术已成为推动创新和协作的重要力量。 11月15日,openEuler峰会将于北京中关村国际创新中心举行。本次峰会,华为云分布式缓存服务(DCS)的两位专家将为大家深入讲解Valkey的核心特性与优势。 更多大…

如何进行产线高阶能耗数据的计算和可视化?

一、前言 在当前经济下行时期,越来越来多企业开始对产线进行数字化转型,提高企业竞争力。在产线数字化转型过程中,产线高阶能耗数据的计算和可视化是比较重要的一环,今天小编就和大家分享如何对产线能耗数据进行计算和可视化。 …

vsftp 修改端口 限制用户登录 开启防火墙 pasv模式

安装设置开机启动 yum -y install vsftpd systemctl start vsftpd systemctl enable vsftpd 修改配置,追加端口号到最后一行 vim /etc/vsftpd/vsftpd.conf listen_port5510 编辑 /etc/services 文件,将其中的三行端口改成5510 vim /etc/services ftp …

IntelliJ IDEA插件开发-代码补全插件入门开发

使用IntelliJ IDEA想必大家都有使用过代码自动补全功能,如输入ab,会自动触发补全,提供相应的补全建议列表。作为有追求的程序员,有没有想过这样的功能是如何实现的?本节将详细介绍如何实现一个类似的代码自动补全插件。…

❤React-React 组件基础(类组件)

❤React-React 组件基础 1、组件化开发介绍 组件化开发思想:分而治之 React的组件按照不同的方式可以分成类组件: 划分方式一(按照组件的定义方式) 函数组件(Functional Component )和类组件(Class Component); …

Python →爬虫实践

爬取研究中心的书目 现在&#xff0c;想要把如下网站中的书目信息爬取出来。 案例一 耶鲁 Publications | Yale Law School 分析网页&#xff0c;如下图所示&#xff0c;需要爬取的页面&#xff0c;标签信息是“<p>”&#xff0c;所以用 itemssoup.find_all("p&…

机器学习: LightGBM模型(优化版)——高效且强大的树形模型

LightGBM&#xff08;Light Gradient Boosting Machine&#xff09;是一种基于梯度提升决策树&#xff08;GBDT&#xff09;的框架&#xff0c;由微软提出。它具有高效的训练速度、低内存占用、支持并行和GPU加速等特点&#xff0c;非常适合大规模数据的训练任务&#xff0c;尤…

《内存函数》

内存函数 1. memcpy函数 &#xff08;1&#xff09;介绍 这里通过memcpy的定义我们可以看这个函数包含三个参数&#xff0c;destination就是拷贝的目的地&#xff0c;source就是拷贝的源头&#xff0c;num就是拷贝的个数。 &#xff08;2&#xff09;使用 这里要包含头文件s…

不泄密的安全远程控制软件需要哪些技术

在数字化浪潮中&#xff0c;远程控制软件已不再是简单的辅助工具&#xff0c;而是成为企业运作和日常工作中不可或缺的一部分。随着远程办公模式的广泛采纳&#xff0c;这些软件提供了一种既安全又高效的途径来管理和访问远端系统。无论是在家办公、技术支持还是远程教育&#…

Pycharm打开终端时报错:Cannot open Local,Failed to start[powershell.exe]

问题如下&#xff1a; 解决办法&#xff1a; 修改设置中的shell path路径 英文版pycharm&#xff1a;file -> settings -> Tools -> Terminal -> Shell path 中文版pycharm&#xff1a;文件 -> 设置 -> 工具 -> 终端 -> Shell路径 将Shell路径不全 …

15分钟学 Go 第 51 天 :通用库与工具使用

第51天&#xff1a;通用库与工具使用 一、学习目标 类别工具/库用途命令行工具cobra构建命令行应用JSON处理gjson高效JSON解析HTTP客户端restyHTTP请求处理日期处理carbon时间日期操作配置管理viper配置文件处理 二、详细实现 让我们通过具体示例来学习这些库的使用&#x…

基于微信小程序的乡村研学游平台设计与实现,LW+源码+讲解

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…

VLC-QT----Linux编译并运行示例

linux:ubuntu 16.04 qt:5.13.2 总体安装步骤 下载安装,编译 下载源码仓库,下载cmake,新建一个build文件夹,cd进去,执行代码 cmake .. -DCMAKE_BUILD_TYPEDebug 遇到报错,没有qt5Coreconfig,运行 sudo apt-get install qtdeclarative5-dev进行安装 遇到报错 Could not fi…

机器学习:XGBoost模型——高效且强大的树形模型

XGBoost&#xff08;Extreme Gradient Boosting&#xff0c;极端梯度提升树&#xff09;是一种强大的梯度提升算法&#xff0c;在现实中被广泛用于分类和回归任务。它通过集成多个简单的基学习器&#xff08;通常是决策树&#xff09;来构建一个强大的预测模型。 基本原理步骤…

爬虫开发工具与环境搭建——开发工具介绍

第二章&#xff1a;爬虫开发工具与环境搭建 第一节 开发工具介绍 爬虫开发需要一些合适的工具和框架来高效地抓取网页数据。在这节中&#xff0c;我们将介绍常用的开发工具&#xff0c;帮助开发者快速搭建爬虫开发环境。 1. Python与爬虫框架选择 Python因其简洁、易学的语法…