Vue全栈开发旅游网项目(10)-用户管理后端接口开发

news2024/11/15 20:02:17

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

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

文件地址:utils/response404.py

from django.http import JsonResponse

class BadRequestJsonResponse(JsonResponse):
    status_code = 400

    def __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 = 405

    def __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.obj
        return {
            'nickname': user.nickname,
            'avatar': user.avatar.url
        }
#返回用户详细信息
class UserProfileSerializers(BaseSerializer):
    #重写父类to_dict函数
    def to_dict(self):
        profile = self.obj
        return {
            '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 = 401
    def __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.profile
            data = {
                '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 = 500
    def __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 timeout

class 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_num

    def 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 = SendSmsCodeForm

    def 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)
    @property
    def 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 username

    def 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:
            return
        phone_num = self.cleaned_data.get('username',None)
        sms_code = self.cleaned_data.get('sms_code', None)
        #注册验证码存入redis中
        return data

    def do_register(self,request):
        #执行注册
        data = self.cleaned_data
        version = 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,profile
        except 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 = result
            data = {
                '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.coloradmin.cn/o/2241035.html

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

相关文章

PostgreSQL中如果有Left Join的时候索引怎么加

在PostgreSQL中,当你的查询包含多个LEFT JOIN和WHERE条件时,合理地添加索引可以显著提高查询性能。以下是一些具体的优化步骤和建议: 1. 分析查询 使用 EXPLAIN ANALYZE 命令分析你的查询,了解查询的执行计划,识别出连…

A027-基于Spring Boot的农事管理系统

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

Vue的基础使用

一、为什么要学习Vue 1.前端必备技能 2.岗位多,绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能(Vue2Vue3) 二、什么是Vue 概念:Vue (读音 /vjuː/,类似于 view) 是一套 构建用户界面 的 渐进式 框架…

Innovus Flexible H-tree and Multi-tap Clock Flow Lab实操系列教程(Day1)

我们都知道时钟树综合在数字IC后端实现中的重要性。做clock tree主要有传统clock tree做法,H tree,Flexible H-tree,fishbone等做法。接下去小编将拿cadence官方的这份Innovus Flexible H-tree and Multi-Tap Clock Flow和对应的lab data来做…

【MySQL】MySQL数据库安装以及报错处理技巧

前言: 本节内容讲述在Ubuntu环境下怎么进行MySQL的安装。 以及一些安装过程中遇到的报错如何处理的问题。 ps:注意, 本篇文章不是图形化界面的MySQL安装教程哦。想要安装图形化界面的MySQL的友友们可以另寻资源了。 目录 更新软件包列表 安装M…

ISP——你可以从这里起步(二)

接上一篇,上一篇是原理篇,这一篇是实战篇,为了实现下面框图中的不完美ISP。 第一章 做一张RAW图自己用 不是所有的人都能获得raw图,即使获得了raw图也需要对应的sensor参数才能把它用起来,所以我找了一条野路子可以把…

CTF攻防世界小白刷题自学笔记14

fileclude,难度:1,方向:Web 题目来源:CTF 题目描述:好多file呀! 给一下题目链接:攻防世界Web方向新手模式第17题。 打开一看,这熟悉的味道,跟上一篇文章基本一摸一样的&#xff…

CTFHub每日练习

文章目录 技能树CTF Web信息泄露目录遍历PHPINFO备份文件下载网站源码bak文件vim缓存.DS_Store Git泄露Logstash index方法一方法二 密码口令弱口令 技能树 CTF Web 信息泄露 目录遍历 PHPINFO 备份文件下载 网站源码 当开发人员在线上环境中对源代码进行了备份操作&#x…

使用CNN进行验证码识别:深度学习与图像预处理教程

验证码(CAPTCHA)广泛用于区分人类和自动化程序(如机器人),通常由扭曲的字母、数字或符号组成。为了实现验证码的自动识别,深度学习尤其是卷积神经网络(CNN)非常有效。本文将带你一起…

Springboot采用jasypt加密配置

目录 前言 一、Jasypt简介 二、运用场景 三、整合Jasypt 2.1.环境配置 2.2.添加依赖 2.3.添加Jasypt配置 2.4.编写加/解密工具类 2.5.自定义加密属性前缀和后缀 2.6.防止密码泄露措施 2.61.自定义加密器 2.6.2通过环境变量指定加密盐值 总结 前言 在以往的多数项目中&#xff0…

讯飞、阿里云、腾讯云:Android 语音合成服务对比选择

在 移动端 接入语音合成方面,讯飞和腾讯云等都是优秀的选择,但各有其特点和优势。咱们的需求是需要支持普通话/英语/法语三种语言,以下是对各个平台的详细比较: 一、讯飞语音合成介绍 与语音听写相反,语音合成是将一段…

python爬虫获得店铺的所有商品

在编写Python爬虫以获取店铺的所有商品信息时,通常涉及到发送HTTP请求、解析响应内容以及处理API返回的数据。以下是一个详细的Python爬虫示例,用于获取店铺的商品信息。这个示例假设API返回的是JSON格式的数据,并且需要API密钥进行认证。 步…

java程序打包及执行 jar命令及运行jar文件

java程序打包及执行 jar命令及运行jar文件 打包命令: 安装完成jdk之后采用 jar命令进行打包 jar -cvfe ddd.jar -C bin/ddd.java 打包 ddd.java 文件 jar -cvfe dddd.jar -C . 注意 -C 后面的点. 表示当前目录下所有 如图: 运行jar 文件 java -class…

计算机视觉空域处理完整版——超详细图文解

空域处理 图像空域处理 a.线性滤波b.非线性滤波c.二值图像处理方法 数学形态学连通成分标记 “点运算”是在不改变图像大小、几何形状以及局部结构的情况下,对像素值进行修改,新图像的像素值只与 原图像同一位置的像素值有关。 灰度级变换(线性变换,非…

【HarmonyOS】Hdc server port XXXX has been used.Configure environment variable

【HarmonyOS】Hdc server port XXXX has been used.Configure environment variable 一、 问题背景: 无法调试debug应用,IDE右下角显示该弹窗: Hdc server port XXXX has been used.Configure environment variable ‘OHOS_HDC_SERVER_POR…

立体工业相机提升工业自动化中的立体深度感知

深度感知对仓库机器人应用至关重要,尤其是在自主导航、物品拾取与放置、库存管理等方面。 通过将深度感知与各种类型的3D数据(如体积数据、点云、纹理等)相结合,仓库机器人可以在错综复杂环境中实现自主导航,物品检测…

深度解析:Android APP集成与拉起微信小程序开发全攻略

目录 一、背景以及功能介绍 二、Android开发示例 2.1 下载 SDK 2.2 调用接口 2.3 获取小程序原始Id 2.4 报错提示:bad_param 2.4.1 错误日志 2.4.2 解决方案 相关推荐 一、背景以及功能介绍 需求:产品经理需要APP跳转到公司的小程序(最好指定页…

stream学习

Stream流 定义 Steam流&#xff0c;用于操作集合或者数组中的数据&#xff0c;大量结合了Lamda表达式的语法风格&#xff0c;代码简洁。 重点&#xff1a; 流只能收集一次 ​ 获取Stream流 Stream流要与数据源建立连接。 1.list ​ 直接调用steam()即可 // list List<Stri…

python基础大杂烩

命令提示符程序&#xff0c;输入python&#xff0c;运行python程序 代码通过解释器程序翻译给计算机去执行 命令提示符输入的python本质上就是调用D:/dev/python/python3.12.5/python.exe这个解释器程序 有python程序将输入的代码翻译成二进制的0和1&#xff0c;去向计算机去运…

嵌入式硬件实战提升篇(一)-泰山派RK3566制作多功能小手机

引言&#xff1a;主要针对于嵌入式全栈内容的知识点汇总并对于linux等相关驱动知识点进行串联&#xff0c;用大家参考学习&#xff0c;并用到了嘉立创提供的泰山派RK3566作为学习的主控。 实物演示如下所示&#xff1a; 目录 一、硬件设计 1.转接电路 2.背光电路 3.音频接…