当前位置: 首页 > news >正文

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手套何以点石成金?

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

穿越数据迷宫:C++哈希表的奇幻旅程

文章目录 前言&#x1f4d4;一、unordered系列关联式容器&#x1f4d5;1.1 unordered 容器概述&#x1f4d5;1.2 哈希表在 unordered 容器中的实现原理&#x1f4d5;1.3 unordered 容器的特点 &#x1f4d4;二、unordered_set 和 unordered_map 的基本操作&#x1f4d5;2.1 un…...

SMT32 智能环境监测系统 嵌入式初学者课堂小组作业

一、应用知识 1&#xff0c;开发语言&#xff1a;C语言 2&#xff0c;开发工具&#xff1a;Keil uVision5、Setup_JLinkARM_V415e 3&#xff0c;开发平台&#xff1a;XCOM V2.0 4&#xff0c;开发知识&#xff1a;温湿度传感DHT11、STM32F4xx中文参考手册 5&#xff0c;文…...

20241114给荣品PRO-RK3566开发板刷Rockchip原厂的Android13下适配RJ45以太网卡

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

JVM这个工具的使用方法

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

创建型设计模式与面向接口编程

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

算法每日双题精讲——滑动窗口(长度最小的子数组,无重复字符的最长子串)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#xff01;&#x1f4aa;…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...