python FastAPI操作数据库实现注册登录

news2024/9/20 14:42:29

代码如下

from fastapi import FastAPI, APIRouter, HTTPException, status
from pydantic import BaseModel
from fastapi.responses import JSONResponse
from typing import Optional
from fastapi.middleware.cors import CORSMiddleware
from utils.time import DateTimeEncoder, getRandomID
from utils.dbutils import insertDB, selectDB
from datetime import datetime
from pydantic import Field

#Pydantic 模型定义
class UserInfo(BaseModel):
    id: int
    user_id: str = Field(..., alias="userId")
    user_name: str = Field(..., alias="userName")# 必须字段,没有默认值
    real_name: Optional[str] = Field("", alias="realName") # 可选字段,默认值为空字符串
    password: str
    phone: str
    person_avatar: Optional[str] = Field("", alias="personAvatar")
    college: Optional[str] = Field("", alias="college")
    major: Optional[str] = Field("", alias="major")
    education: Optional[str] = Field("", alias="education")
    person_desc: Optional[str] = Field(None, alias="personDesc")
    create_time: datetime = Field(..., alias="createTime")
    update_time: Optional[datetime] = Field(None, alias="updateTime")
    is_deleted: int = Field(..., alias="isDeleted")
    last_login_time: int = Field(..., alias="lastLoginTime")

    class Config:
        from_attributes  = True
        populate_by_name = True


class RegisterInfo(BaseModel):
    userName: str 
    phone: str
    password: str
    # password: Optional[str] = None

class LoginInfo(BaseModel):
    phone: str
    password: str


# 登录
@router.post("/login")
async def login(loginInfo: LoginInfo):
    selectSql = '''
            select * from userinfo where phone = '{}' and password = '{}'
    '''.format(loginInfo.phone, loginInfo.password)
    userList = selectDB(selectSql)
    if len(userList) == 1:
       #UserInfo(**userList[0]) 的含义是将 userList[0] 字典中的所有键值对作为关键字参数传递给 UserInfo 模型的构造函数,从而创建一个 UserInfo 实例。
       #例如,如果 userList[0] 是 {"id": 17, "user_id": "uid2024062618231266424", "user_name": "cc", ...},那么 UserInfo(**userList[0]) 相当于 UserInfo(id=17, user_id="uid2024062618231266424", user_name="cc", ...)。
        userInfo = UserInfo(**userList[0])
        #userInfo.dict(by_alias=True) 将模型转换为字典并使用别名,这样返回的数据就会使用驼峰命名法。
        return {"code": 200, "msg": '登录', "data": userInfo.dict(by_alias=True)}

    return {"code": 500, "msg": '登录失败', "data": {}}


#注册
@router.post("/register")
async def register(registerInfo: RegisterInfo):
    selectSql = '''
            SELECT * from userinfo WHERE phone='{}' or user_name='{}'
        '''.format(registerInfo.phone, registerInfo.userName)
    userList = selectDB(selectSql)
    if len(userList) > 0:
        return {"code": 500, "msg": '该用户已存在', "data": {}}
    
    uid = 'uid' + getRandomID()
    sql = '''
    INSERT INTO userinfo(user_id, phone, user_name, password) VALUES('{}', '{}', '{}', '{}')
    '''.format(uid, registerInfo.phone, registerInfo.userName,registerInfo.password)

    effectRow = insertDB(sql=sql)
    print(effectRow)
    if effectRow != 1:
        return {"code": 500, "msg": '注册失败', "data": {}}
    
    return {"code": 200, "msg": '注册成功', "data": {"userId": uid}}

接口调用

postman调用登录接口,返回值
在这里插入图片描述

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

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

相关文章

消失的80后都去哪里了

曾经被贴上各种标签的80后,最大的已经44岁,最小的也都35岁了,都已人到中年了。 在80后眼里的弟弟妹妹的90后,已经奔四了,而觉得与80后有代差的95后已是职场主力,而某些80后的孩子00后也已经开始陆续进入职场…

【系统架构设计师】计算机组成与体系结构 ③ ( 层次化存储结构 | 寄存器 | 高速缓存 | 内存 | 外存 )

文章目录 一、层次化存储结构1、层次化存储结构2、层次化存储结构 - 示例说明3、程序员可操作的部分 计算机 采用 分级存储结构 , 主要目的是 为了 解决 容量 / 价格 / 速度 之间的矛盾 ; 一、层次化存储结构 1、层次化存储结构 计算机 存储器 按照存储速度 由快到慢 进行排序 …

关于sum+=1与sum=sum+1的关系(C语言)

一、sum 1;与sum sum 1;是相等的&#xff0c;运算结果相等&#xff1b; 二、用一段代码说明&#xff1b; # define _CRT_SECURE_NO_WARNINGS #include <stdio.h>int main() {//初始变量值&#xff1b;int n1 1;int n2 1;//输出&#xff1b;printf("运算前的n…

02逻辑代数与硬件描述语言基础

2.1 逻辑代数&#xff08;简单逻辑的运算&#xff09; 2.2 逻辑函数的卡诺图&#xff08;从图论的角度&#xff09;化简法 2.3 硬件描述语言Verilog HDL基础&#xff08;研究生阶段才用得到&#xff09; 要求&#xff1a; 1、熟悉逻辑代数常用基本定律、恒等式和规则。 2、掌握…

电脑文件concrt140.dll丢失要怎么恢复?靠谱修复方法分析

电脑文件concrt140.dll丢失这种情况&#xff0c;相对来说还是比较少见的&#xff01;但是不代表没有&#xff0c;既然有人出现这种情况了&#xff0c;那么小编势必要给大家详细的讲解一下concrt140.dll这个文件&#xff0c;以及我们要怎么去解决concrt140.dll文件丢失的问题。下…

龙国南方航空滑块acw_v2+cookie+风控处理+type后缀

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未经许可禁…

【Linux】进程优先级 | 环境变量

目录 Ⅰ. 进程优先级&#xff08;Process Priority&#xff09; 1. 什么是进程优先级&#xff1f; 2. 查看系统进程 3. 修改进程优先级 4.优先级调度原理 Ⅱ. 进程的切换&#xff08;Process Switch&#xff09; 1. 竞争与独立 2. 并行与并发 3. 进程抢占 4.实现切换…

龙迅LT8711V TYPE-CDP 1.2转VGA芯片,内置MCU,成熟批量产品

龙迅LT8711V描述&#xff1a; LT8711V是一种高性能的Type-C/DP1.2到VGA转换器&#xff0c;设计用于连接USB Type-C源或DP1.2源到VGA接收器。LT8711V集成了一个DP1.2兼容的接收器&#xff0c;和一个高速三通道视频DAC。此外&#xff0c;还包括两个CC控制器&#xff0c;用于CC通…

Vue2 - 项目上线后生产环境中去除console.log的输出以及断点的解决方案

前言 当你准备将Vue.js应用程序部署到生产环境时,一个关键的优化步骤是移除代码中的所有 console.log 语句以及断点。在开发阶段,console.log 是一个非常有用的调试工具,但在生产环境中保留它们可能会影响性能和安全性。在本文中,我将向你展示如何通过使用Vue CLI 2来自动…

三种分布式锁实现方式

目录 1、数据库自增 2、Redis自增 3、Zookeeper 4、其他 4.1、雪花算法 4.2、Tinyid 4.3、Leaf 4.4、数据库号段 1、数据库自增 利用数据库表的自增特性&#xff0c;或主键唯一性&#xff0c;实现分布式ID REPLACE INTO id_table (stub) values (’a‘) ; SELECT LA…

Adobe Indesign 操作

页面设计 页面设置 版面&#xff1a;图文和空白部分的总和。 版心&#xff1a;规划在版面中排印文本和图片的部分。 开本&#xff1a;单个页面的宽度和高度。 如图所示&#xff0c;新建文件&#xff0c;自定义是210297毫米。这个数据是开本大小。 点击“边距和分栏”&#…

Redis-主从复制-测试主从模式下的读写操作

文章目录 1、在主机6379写入数据2、在从机6380上写数据报错3、从机只能读数据&#xff0c;不能写数据 1、在主机6379写入数据 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> set uname jim OK 127.0.0.1:6379> get uname "jim" 127.0.0.1:6379>…

入职必备-mac下载安装maven

1、Maven 下载 1.1、官网下载安装包 官网下载链接 历史版本下载&#xff1a; Index of /dist/maven/maven-3/3.8.8/binaries 注意 .bash_profile 文件中的符号可能会影响配置 1.2、解压文件 2、Maven 环境配置 2.1、Java JDK 依赖 配置 maven 环境变量需要先配置好 JDK …

指纹浏览器是什么?跨境多账号安全如何保证?

随着电子商务的蓬勃发展&#xff0c;越来越多的商家选择开设多店来扩大经营规模。然而多店运营也带来了一系列的挑战&#xff0c;其中之一就是账号安全。 1. 了解反检测浏览器和代理服务器 在我们开始讨论如何有效地使用反检测浏览器之前&#xff0c;我们首先需要了解这两个工…

【ajax实战02】数据管理网站—验证码登录

一&#xff1a;数据提交&#xff08;提交手机验证码&#xff09; 核心思路整理 利用form-serialize插件&#xff0c;收集对象形式的表单数据后&#xff0c;一并提交给服务器。后得到返回值&#xff0c;进一步操作 基地址&#xff1a; axios.defaults.baseURL http://geek.…

3d模型材质吸不了什么原因?怎么解决?---模大狮模型网

3D模型无法吸取材质可能有以下原因&#xff1a; 文件格式不支持&#xff1a;某些文件格式(如STL)不支持嵌入材质信息&#xff0c;因此在导入此类文件后&#xff0c;需要手动为模型添加材质。 材质链接错误&#xff1a;如果模型文件中嵌入了材质信息&#xff0c;但是链接错误&a…

WiFi模块ESP8266同阿里物联网云平台连接(超详细)

写在前面&#xff1a;本节主要的内容是利用ESP8266模块&#xff0c;同阿里云物联网平台的连接&#xff0c;为后面的实现数据的远程展示与处理做好铺垫。 本节的主要内容分为一下几个阶段进行&#xff1a; 1、阿里云物联网平台的创建2、阿里云 IOT studio界面绘制3、mqtt.fx软件…

浅谈逻辑控制器之仅一次控制器

浅谈逻辑控制器之仅一次控制器 “仅一次控制器”(Once Only Controller) 是一个非常实用的组件&#xff0c;它允许用户控制测试计划中的某些操作仅执行一次&#xff0c;无论其所在的线程组或父级控制器设置了多少次循环。本指南将详细介绍“仅一次控制器”的功能、使用场景及配…

2024欧洲杯来啦!这个AI网站预测还挺准;10条Prompt包你测出AI视频工具的成色;AI搜索版「苦涩的教训」入行必学 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;ShowMeAI官网 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 1. 2024年欧洲杯来了&#xff01;AI预测比赛结果的玩法&#xff0c;也越来越高级了~ 2024 年欧洲杯于6月14日至7月14日在德国举行&#xff0c;共有24支国家队参加…

flash申请内存失败,导致老化问题解决

背景 在闪光灯初始化阶段客制化了一个buffer&#xff0c;下发到kernel的闪光灯驱动中用于保存读取闪光灯寄存器的值。功能测试都是正常的&#xff0c;但是一旦开始批量跑产线老化测试会有1/4500左右概率的后主摄拍照卡住。定位根因是闪光灯初始化失败&#xff0c;进一步原因就…