fastzdp_login的第一次构建

概述

为了方便能够快捷的实现fastapi实现登录相关功能代码开发,决定开发一个开源的fastapi组件库,想了很多个名字,在检查pypi的时候发现都被占用了,所以最终决定使用fastzdp_login这个名字。
fast代表的时fastapi。zdp代表的是张大鹏。login代表的是登录功能。
希望通过fastzdp_login这个库,能够简化使用fastapi开发登录功能的逻辑,实现低代码低成本的开发。

环境搭建

首先是安装基本依赖:

pip install poetry 
poetry add fastapi

fastapi底层依赖特别多,所以安装特别慢,不信你看:
在这里插入图片描述

而我们的zdppy_api框架则是零依赖的,安装速度特别快。所以,如果你zdppy_api和fastapi都会的话,建议你优先使用zdppy_api这个框架。
这里之所以开发fastapi的组件库并开源,主要是为了方便在工作中使用fastapi作为核心框架的同学。

接着,还需要安装操作MySQL数据库的依赖:

poetry add sqlmodel[mysql]

在这里插入图片描述

最后,是我们启动服务的依赖:

poetry add uvicorn

配置pip国内源:

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

配置poetry国内源:

poetry source add --priority=default mirrors https://pypi.tuna.tsinghua.edu.cn/simple/

用户增删改查示例

from fastapi import FastAPI, Depends, HTTPException, status
from sqlalchemy.orm import Session as SASession
from sqlmodel import SQLModel, Field, Session, create_engine, select
from typing import Optional


class User(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    username: str = Field(index=True)
    password: str
    email: str
    phone: str
    avatar: str
    name: str


# 创建数据库引擎
sqlite_url = "mysql+pymysql://root:zhangdapeng520@127.0.0.1:3306/zdppy_demo?charset=utf8mb4"
engine = create_engine(sqlite_url, echo=True)

# 确保表存在
SQLModel.metadata.create_all(engine)

app = FastAPI()


# 依赖项,为每个请求提供数据库会话
def get_db():
    db = Session(engine)
    try:
        yield db
    finally:
        db.close()


@app.post("/users/", response_model=User)
def create_user(user: User, db: SASession = Depends(get_db)):
    db.add(user)
    db.commit()
    db.refresh(user)
    return user


# 读取所有用户
@app.get("/users/", response_model=list[User])
def read_users(db: SASession = Depends(get_db)):
    return db.exec(select(User)).all()


# 读取单个用户
@app.get("/users/{user_id}", response_model=User)
def read_user(user_id: int, db: SASession = Depends(get_db)):
    user = db.get(User, user_id)
    if not user:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User not found")
    return user


# 更新用户
@app.put("/users/{user_id}", response_model=User)
def update_user(user_id: int, user: User, db: SASession = Depends(get_db)):
    db_user = db.get(User, user_id)
    if not db_user:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User not found")
    for field in user.__fields__:
        if getattr(user, field.name, None) is not None:
            setattr(db_user, field.name, getattr(user, field.name))
    db.commit()
    db.refresh(db_user)
    return db_user


# 删除用户
@app.delete("/users/{user_id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_user(user_id: int, db: SASession = Depends(get_db)):
    db_user = db.get(User, user_id)
    if db_user is None:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User not found")
    db.delete(db_user)
    db.commit()
    return None


if __name__ == '__main__':
    import uvicorn

    uvicorn.run(app, host='0.0.0.0', port=8000)

开发注册接口

from fastapi import FastAPI, Depends, HTTPException, status, Body
from sqlalchemy.orm import Session as SASession
from sqlmodel import SQLModel, Field, Session, create_engine, select
from typing import Optional
from passlib.hash import pbkdf2_sha256 as sha256  # 用于密码哈希


class User(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    username: str = Field(index=True)
    password: str


# 创建数据库引擎
sqlite_url = "mysql+pymysql://root:zhangdapeng520@127.0.0.1:3306/zdppy_demo?charset=utf8mb4"
engine = create_engine(sqlite_url, echo=True)

# 确保表存在
SQLModel.metadata.drop_all(engine)
SQLModel.metadata.create_all(engine)

app = FastAPI()


# 依赖项,为每个请求提供数据库会话
def get_db():
    db = Session(engine)
    try:
        yield db
    finally:
        db.close()


@app.post("/users/register/", status_code=status.HTTP_201_CREATED)
def register_user(
        username: str = Body(str, min_length=2, max_length=36),
        password: str = Body(str, min_length=6, max_length=128),
        db: SASession = Depends(get_db),
):
    # 检查用户名是否已存在
    user = db.exec(select(User).where(User.username == username)).first()
    if user:
        raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Username already exists")

    # 对密码进行哈希处理
    hashed_password = sha256.hash(password)

    # 创建新用户
    new_user = User(username=username, password=hashed_password)
    db.add(new_user)
    try:
        db.commit()
        db.refresh(new_user)
    except Exception as e:
        print(e)
        db.rollback()
        raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Operation failed")

    return {"message": "User registered successfully", "user_id": new_user.id}

实现登录接口

import time

from fastapi import FastAPI, Depends, HTTPException, status, Body
from sqlalchemy.orm import Session as SASession
from sqlmodel import SQLModel, Field, Session, create_engine, select
from typing import Optional
from passlib.hash import pbkdf2_sha256 as sha256  # 用于密码哈希
from jwt import encode as jwt_encode
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm


class User(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    username: str = Field(index=True)
    password: str


# 创建数据库引擎
sqlite_url = "mysql+pymysql://root:zhangdapeng520@127.0.0.1:3306/zdppy_demo?charset=utf8mb4"
engine = create_engine(sqlite_url, echo=True)

# 确保表存在
SQLModel.metadata.drop_all(engine)
SQLModel.metadata.create_all(engine)

app = FastAPI()

# 创建一个 OAuth2 令牌
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

# 伪造一个密钥,实际使用时应该使用安全的方式存储
SECRET_KEY = "your-secret-key"
ALGORITHM = "HS256"

# 令牌有效期
ACCESS_TOKEN_EXPIRE_MINUTES = 30


# 假设你有一个获取用户的函数
def get_user(db: SASession, username: str):
    return db.exec(select(User).where(User.username == username)).first()


# 依赖项,为每个请求提供数据库会话
def get_db():
    db = Session(engine)
    try:
        yield db
    finally:
        db.close()


@app.post("/users/register/", status_code=status.HTTP_201_CREATED)
def register_user(
        username: str = Body(str, min_length=2, max_length=36),
        password: str = Body(str, min_length=6, max_length=128),
        db: SASession = Depends(get_db),
):
    # 检查用户名是否已存在
    user = db.exec(select(User).where(User.username == username)).first()
    if user:
        raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Username already exists")

    # 对密码进行哈希处理
    hashed_password = sha256.hash(password)

    # 创建新用户
    new_user = User(username=username, password=hashed_password)
    db.add(new_user)
    try:
        db.commit()
        db.refresh(new_user)
    except Exception as e:
        print(e)
        db.rollback()
        raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Operation failed")

    return {"message": "User registered successfully", "user_id": new_user.id}


# 登录接口
@app.post("/token/", response_model=dict, status_code=status.HTTP_200_OK)
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(), db: SASession = Depends(get_db)):
    user = get_user(db, form_data.username)
    if not user:
        raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Incorrect username or password")
    if not sha256.verify(form_data.password, user.password):
        raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Incorrect username or password")
    access_token = jwt_encode(
        {"username": user.username, "id": user.id, "time": time.time(), "expired": ACCESS_TOKEN_EXPIRE_MINUTES * 60},
        SECRET_KEY,
        algorithm=ALGORITHM,
    ).encode("utf-8")
    return {"access_token": access_token, "token_type": "bearer"}


if __name__ == '__main__':
    import uvicorn

    uvicorn.run(app, host='0.0.0.0', port=8000)

后续

后面根据这两个原型接口进行改造。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AutoGen 两个agent讲相声

Lesson 1: Multi-Agent Conversation and Stand-up Comedy 第 1 课:多人对话和单口相声 Setup from utils import get_openai_api_key OPENAI_API_KEY get_openai_api_key() llm_config {"model": "gpt-3.5-turbo"}Define an AutoGen agent…

深度揭秘!Kafka和ZooKeeper之间的相爱相杀

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hey大家好,我是小米,今天我们来聊一聊在Kafka中,ZooKeeper到底扮演了什么样的重要角色。你是不是也曾在面试中被问到这个问题?别担心,今天这篇文章…

c进阶篇(三):字符串函数

1.strlen: strlen - C Reference strlen 函数是一个标准库函数&#xff0c;用于计算以 null 结尾的字符串的长度&#xff0c;也就是字符串中实际字符的数量&#xff0c;不包括最后的 null 终止符 \0。它定义在 <string.h> 头文件中。 函数原型:size_t strlen(const ch…

嵌入式UI开发-lvgl+wsl2+vscode系列:5、事件(Events)

一、前言 这节进行事件的总结&#xff0c;通过事件回调方式将用户和ui的交互行为绑定组合起来。 二、事件示例 1、示例1&#xff08;点击事件&#xff09; #include "../lv_examples.h" #if LV_BUILD_EXAMPLES && LV_USE_SWITCHstatic void event_cb(lv_…

关于发那科机器人系统升级方法

首先需要镜像备份和全备份&#xff0c;最好把机器人要到刻度线位置&#xff0c;零点位置 选择控制器启动&#xff0c;也可以按preevnext进入控制器模式

Spring Boot 实现 AOP 动态热插拔功能并附DEMO源码

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

排序(堆排序、快速排序、归并排序)-->深度剖析(二)

前言 前面介绍了冒泡排序、选择排序、插入排序、希尔排序&#xff0c;作为排序中经常用到了算法&#xff0c;还有堆排序、快速排序、归并排序 堆排序&#xff08;HeaSort&#xff09; 堆排序的概念 堆排序是一种有效的排序算法&#xff0c;它利用了完全二叉树的特性。在C语言…

2023软考中级《软件设计师》(备考冲刺版) | 数据库系统

目录 1.数据库的基本概念 1.1 数据库体系结构 1.2 三级模式结构 1.3 数据仓库 2.数据库设计过程 2.1 概念结构设计 2.1.1 概念设计过程 2.1.2 E-R图 2.2 逻辑结构设计 2.2.1 关系模式相关概念 2.2.2 E-R图转关系模式&#xff08;涉及下午题&#xff09; 2.2.3 关系…

以太网电缆专家手册:掌握RJ45连接器压接的艺术与科学

在这个日新月异的数字时代&#xff0c;正确的连接方式至关重要&#xff0c;而RJ45连接器正是实现这一点的关键工具之一。无论您是在家中布置办公网络&#xff0c;还是在公司部署复杂的IT基础架构&#xff0c;或是进行任何需要设备间高效数据传输的活动&#xff0c;掌握如何正确…

从实验室走向商业化,人形机器人时代要来了?

从国内市场看&#xff0c;据机构报告显示&#xff0c;预计到2026年中国人形机器人产业规模将突破200亿元。特别是在生成式AI技术大爆发的当下&#xff0c;未来人形机器人更是极有可能实现超预期增长。 近日&#xff0c;特斯拉CEO埃隆马斯克(Elon Musk)在特斯拉2024年股东大会上…

深入解析HDFS:定义、架构、原理、应用场景及常用命令

引言 Hadoop分布式文件系统&#xff08;HDFS&#xff0c;Hadoop Distributed File System&#xff09;是Hadoop框架的核心组件之一&#xff0c;它提供了高可靠性、高可用性和高吞吐量的大规模数据存储和管理能力。本文将从HDFS的定义、架构、工作原理、应用场景以及常用…

3d里面减小模型大小的键是什么意思?---模大狮模型网

在3D建模和动画制作中&#xff0c;调整模型的大小是常见的操作&#xff0c;但这并不仅仅意味着简单地改变模型的尺寸。特别是当我们谈论到"减小模型大小的键"时&#xff0c;涉及到更深层次的技术和工作流程。让我们深入探讨这一话题&#xff0c;理解在3D环境中如何有…

赋能心理大模型,景联文科技推出高质量心理大模型数据库

生成式大模型作为当前发展势头最为强劲的人工智能前沿技术&#xff0c;其在临床心理学领域中的创新应用已成为社会关注和医学聚焦的热点之一。 心理大模型在落地应用过程中可能面临的痛点主要包括以下几个方面&#xff1a; 数据隐私与安全&#xff1a;确保敏感的个人信息在模型…

# 职场生活之道:善于团结

在职场这个大舞台上&#xff0c;每个人都是演员&#xff0c;也是观众。要想在这个舞台上站稳脚跟&#xff0c;除了专业技能&#xff0c;更要学会如何与人相处&#xff0c;如何团结他人。团结&#xff0c;是职场生存的重要法则之一。 1. 主动团结&#xff1a;多一个朋友&#x…

祝贺《华为战略管理法:DSTE实战体系》被《中国企业家》杂志评为企业家枕边书50本之一(宏观战略类书籍)

祝贺《华为战略管理法&#xff1a;DSTE实战体系》被《中国企业家》杂志评为企业家枕边书50本之一 2024年4月23日&#xff08;周二&#xff09;下午13:00&#xff0c;《中国企业家》杂志如期举办“每天都是读书日”线下活动。 《中国企业家》杂志携手商界大咖共同推选50本枕边书…

基于X86+FPGA+AI的智能仓储AGV机器人解决方案

应用场景 智能仓储是物流过程的一个环节&#xff0c;智能仓储的应用&#xff0c;保证了货物仓库管理各个环节数据输入的速度和准确性&#xff0c;确保企业及时准确地掌握库存的真实数据&#xff0c;合理保持和控制企业库存&#xff0c;其中搬运环节目前已大量采用AGV的方式进行…

Administrators就最高了???system是什么??本地用户提权内网学习第三天 你知道uac是什么??

我们今天来说说本地用户提权的操作&#xff0c;我们在有webshell过后我们要进行进一步的提权操作&#xff0c;要不然对我们后期的内网渗透会有一些阻碍的操作。比如说我们使用mimikatz来进行抓取密码&#xff0c;就不能够成功。 Administrators与system的区别 我们来说说Admin…

高考不是终点:如何利用教育资源实现人生跃迁?普鲁士教育的利弊,你了解吗?从科举到高考,中国教育的变迁!链接上层,获取核心资源的途径

高考已经结束&#xff0c;这两天分数将会陆续出来&#xff0c;无论结果好坏&#xff0c;我都希望你明白一些道理。这些道理在学校老师不会教你&#xff0c;但是非常重要。 一、中国的科举制度 科举制度是为王朝服务的。 科举制度是中国古代通过考试选拔官员的制度&#xff0c…

2024年道路运输安全员(企业管理人员)备考题库资料。

46.危险货物道路运输随车携带的单据&#xff0c;下列选项不属于的是&#xff08;&#xff09;。 A.道路运输危险货物安全卡 B.运单或者电子运单 C.道路危险货物运输从业资格证 D.车辆检测报告 答案&#xff1a;D 47.危险货物运输驾驶人员在24小时内实际驾驶车辆时间累计不…

Generating Diverse Structure for Image Inpainting With Hierarchical VQ-VAE

Jialun Peng1 Dong Liu1* Songcen Xu2 Houqiang Li1 1 University of Science and Technology of China 2 Noahs Ark Lab, Huawei Technologies Co., Ltd.pjlmail.ustc.edu.cn, {dongeliu, lihq}ustc.edu.cn, xusongcenhuawei.com 原文提供代码链接&#xff1a; GitHub - UST…