fastapi框架搭建的python项目,实现链接数据库,实现用户的登录和注册

好的,下面是重新整理后的完整实现,包含你的 database.py 配置。

1. 安装依赖

确保安装了 FastAPI, SQLAlchemy, psycopg2-binary, PassLibPyJWT 库:

pip install fastapi sqlalchemy psycopg2-binary passlib[bcrypt] pyjwt

2. 配置数据库

app/core/config.py

class Settings:DATABASE_URL = "postgresql://user:password@localhost/dbname"settings = Settings()

app/db/database.py

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from app.core.config import settingsengine = create_engine(settings.DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()def get_db():db = SessionLocal()try:yield dbfinally:db.close()

3. 定义模型

app/db/models.py

from sqlalchemy import Column, Integer, String, DateTime, Boolean
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetimeBase = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True, index=True)userId = Column(String, unique=True, index=True, nullable=False)userName = Column(String, index=True, nullable=False)password = Column(String, nullable=False)createTime = Column(DateTime, default=datetime.utcnow)updateTime = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)deleted = Column(Boolean, default=False)

4. 创建数据库表

app/main.py

from fastapi import FastAPI
from app.db.database import engine
from app.db import models
from app.routers import authapp = FastAPI()models.Base.metadata.create_all(bind=engine)app.include_router(auth.router, prefix="/auth", tags=["auth"])

5. 定义 Pydantic 模式

app/db/schemas.py

from pydantic import BaseModelclass UserCreate(BaseModel):userId: struserName: strpassword: strclass UserLogin(BaseModel):userId: strpassword: str

6. 实现用户注册和登录

app/routers/auth.py

from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from passlib.context import CryptContext
from jose import JWTError, jwt
from datetime import datetime, timedeltafrom app.db import models, schemas
from app.db.database import get_dbrouter = APIRouter()pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
SECRET_KEY = "secret"  # 请使用更复杂的密钥
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30def verify_password(plain_password, hashed_password):return pwd_context.verify(plain_password, hashed_password)def get_password_hash(password):return pwd_context.hash(password)def create_access_token(data: dict, expires_delta: timedelta = None):to_encode = data.copy()if expires_delta:expire = datetime.utcnow() + expires_deltaelse:expire = datetime.utcnow() + timedelta(minutes=15)to_encode.update({"exp": expire})encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)return encoded_jwt@router.post("/register", response_model=schemas.UserCreate)
def register_user(user: schemas.UserCreate, db: Session = Depends(get_db)):db_user = db.query(models.User).filter(models.User.userId == user.userId).first()if db_user:raise HTTPException(status_code=400, detail="User ID already registered")hashed_password = get_password_hash(user.password)db_user = models.User(userId=user.userId, userName=user.userName, password=hashed_password)db.add(db_user)db.commit()db.refresh(db_user)return db_user@router.post("/login")
def login_user(user: schemas.UserLogin, db: Session = Depends(get_db)):db_user = db.query(models.User).filter(models.User.userId == user.userId).first()if not db_user:raise HTTPException(status_code=400, detail="Invalid user ID or password")if not verify_password(user.password, db_user.password):raise HTTPException(status_code=400, detail="Invalid user ID or password")access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)access_token = create_access_token(data={"sub": db_user.userId}, expires_delta=access_token_expires)return {"access_token": access_token, "token_type": "bearer"}

7. 注册路由

app/main.py

from fastapi import FastAPI
from app.db.database import engine
from app.db import models
from app.routers import authapp = FastAPI()models.Base.metadata.create_all(bind=engine)app.include_router(auth.router, prefix="/auth", tags=["auth"])

项目结构

.
├── app
│   ├── core
│   │   ├── config.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   ├── db
│   │   ├── database.py
│   │   ├── __init__.py
│   │   ├── models.py
│   │   ├── __pycache__
│   │   └── schemas.py
│   ├── __init__.py
│   ├── main.py
│   ├── __pycache__
│   ├── routers
│   │   ├── auth.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   ├── schemas
│   │   └── __init__.py
│   ├── services
│   │   ├── __init__.py
│   │   └── __pycache__
│   └── utils
│       └── __init__.py
├── README.md
├── requirements.txt
├── run.py
├── tests
│   ├── __init__.py
│   └── test_main.http

现在,你可以运行你的 FastAPI 应用,并使用 /auth/register 路由进行用户注册,使用 /auth/login 路由进行登录并获取 JWT token。

要调用上面的代码,首先需要确保 FastAPI 应用已正确配置并运行。以下是调用该应用的一些步骤和示例:

1. 确保项目结构正确

确保项目结构与以下一致:

.
├── app
│   ├── core
│   │   ├── config.py
│   │   ├── __init__.py
│   └── db
│       ├── database.py
│       ├── models.py
│       ├── schemas.py
│   ├── main.py
│   ├── routers
│       ├── auth.py
│   └── __init__.py
├── README.md
├── requirements.txt
├── run.py
├── tests
│   └── test_main.http

2. 编写启动脚本

编写一个启动脚本 run.py,用于运行 FastAPI 应用。

# run.py
import uvicornif __name__ == "__main__":uvicorn.run("app.main:app", host="127.0.0.1", port=8000, reload=True)

3. 启动应用

在终端中运行以下命令启动 FastAPI 应用:

python run.py

此时,FastAPI 应用将运行在 http://127.0.0.1:8000

4. 调用 API 进行用户注册和登录

可以使用 HTTP 客户端工具(如 curl 或 Postman)调用 API 进行用户注册和登录。

使用 curl 命令行工具

用户注册

curl -X POST "http://127.0.0.1:8000/auth/register" -H "Content-Type: application/json" -d '{"userId": "testuser","userName": "Test User","password": "testpassword"
}'

用户登录

curl -X POST "http://127.0.0.1:8000/auth/login" -H "Content-Type: application/json" -d '{"userId": "testuser","password": "testpassword"
}'
使用 Postman 工具

用户注册

  1. 打开 Postman。
  2. 创建一个新的 POST 请求,URL 为 http://127.0.0.1:8000/auth/register
  3. 在 Headers 中添加 Content-Type: application/json
  4. 在 Body 中选择 raw 并粘贴以下 JSON 数据:
    {"userId": "testuser","userName": "Test User","password": "testpassword"
    }
    
  5. 点击 Send 按钮发送请求。

用户登录

  1. 创建一个新的 POST 请求,URL 为 http://127.0.0.1:8000/auth/login
  2. 在 Headers 中添加 Content-Type: application/json
  3. 在 Body 中选择 raw 并粘贴以下 JSON 数据:
    {"userId": "testuser","password": "testpassword"
    }
    
  4. 点击 Send 按钮发送请求。

5. 测试和验证

可以编写测试文件来测试 API。

tests/test_main.http

### 用户注册
POST http://127.0.0.1:8000/auth/register
Content-Type: application/json{"userId": "testuser","userName": "Test User","password": "testpassword"
}### 用户登录
POST http://127.0.0.1:8000/auth/login
Content-Type: application/json{"userId": "testuser","password": "testpassword"
}

在你的 IDE(如 PyCharm 或 VS Code)中使用 HTTP 客户端工具执行这些 HTTP 请求文件,验证 API 是否正常工作。

通过这些步骤,你应该能够成功调用上面的代码,实现用户注册和登录功能并获取 JWT token。

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

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

相关文章

一文速通23种设计模式——单例模式、工厂模式、建造者模式、原型模式、代理模式、装饰器模式、组合模式、组合模式、桥接模式、观察者模式、策略模式……

一文速通23种设计模式 写在前面 本文基于结城浩所著《图解设计模式》,其中所使用代码皆为Java版本。 随书代码下载地址-点击“随书下载” 全文15205字,全部读完需要约20分钟。 目录 一文速通23种设计模式写在前面 第一部分 适应设计模式迭代器模式 (…

leetcode刷题记录29-135. 分发糖果

问题描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果,计算并返回需要…

vue3+ts全局注册方法

目录 使用 provide 和 inject 注册全局mian.ts中注册在组件中使用 还有vue 中的 getCurrentInstance的使用 使用 provide 和 inject 注册全局 mian.ts中注册 // main.jsimport { createApp, provide } from vue; import App from ./App.vue;const app createApp(App);// 创建…

Unity开发——编辑器打包、3种方式加载AssetBundle资源

一、创建ab资源 (一)Unity资源设置ab格式 1、选中要打包成assetbundle的资源; 可以是图片,材质球,预制体等,这里方便展示用预制体打包设置展示; 2、AssetBundle面板说明 (1&…

【YOLOv5进阶】——模型结构与模型原理YOLOv5源码解析

一、基础知识 1、backbone backbone是核心组成部分,主要负责提取图像特征。具体来说,backbone通过一系列的卷积层和池化层对输入图像进行处理,逐渐降低特征图的尺寸同时增加通道数,从而保留和提取图像中重要的特征。这些提取出的…

[Python] 权重越大的元素被选中的概率就越大

random.choices 函数可以根据指定的权重来进行随机选择,而权重越大的元素被选中的概率就越大。 下面是一个示例代码,展示了如何根据元组中的分数来生成对应的随机选择算法: import random# 示例列表 data [("Alice", 80), (&quo…

Unity3D获得服务器时间/网络时间/后端时间/ServerTime,适合单机游戏使用

说明 一些游戏开发者在做单机游戏功能时(例如:每日奖励、签到等),可能会需要获得服务端标准时间,用于游戏功能的逻辑处理。 问题分析 1、自己如果有服务器:自定义一个后端API,客户端按需请求…

笔记你没流量,因为你不懂小红书规则!

今天,就让小番来告诉你,小红书两大流量机制「推荐流量」和「搜索流量」算法的秘密,让你彻底明白为什么你的笔记一直默默无闻! 图片 我们先看下小红书推荐流量的整个分配流程,可以看到笔记发布之后,平台会…

使用Obfuscar 混淆WPF(Net6)程序

Obfuscar 是.Net 程序集的基本混淆器,它使用大量的重载将.Net程序集中的元数据(方法,属性、事件、字段、类型和命名空间的名称)重命名为最小集。详细使用方式参见:Obfuscar 在NetFramework框架进行的WPF程序的混淆比较…

Spring @Transactional 事务注解

一、spring 事务注解 1、实现层(方法上加) import org.springframework.transaction.annotation.Transactional;Transactional(rollbackFor Exception.class)public JsonResult getRtransactional() {// 手动标记事务回滚TransactionAspectSupport.currentTransactionStatus…

抖店入驻门槛,一降再降,2024年商家入驻抖店最佳的时机来了!

大家好,我是电商糖果 抖店已经发展有四年多的时间了,现在也算是比较成熟的电商平台. 这几年因为直播带货的火爆,再加上抖音的流量支撑,还有抖音在背后的扶持和推广。 让抖店成了电商行业的黑马项目,吸引了不少商家入…

ACWC:Worst-Case to Average-Case Decryption Error

参考文献: [LS19] Lyubashevsky V, Seiler G. NTTRU: Truly Fast NTRU Using NTT[J]. IACR Transactions on Cryptographic Hardware and Embedded Systems, 2019: 180-201.[DHK23] Duman J, Hvelmanns K, Kiltz E, et al. A thorough treatment of highly-efficie…

[element-ui]el-form自定义校验-图片上传验证(手动触发部分验证方法)

背景: 在做导入文件功能的时候,需要校验表单,如图所示 店铺字段绑定在表单数据对象上,在点击确定的时候正常按照表单验证规则去校验,就不再赘述。 文件上传是个异步过程,属性值改变后不会去触发验证规则…

智能管理,无忧报修——高校校园报事报修系统小程序全解析

随着数字化、智能化的发展,高校生活也迎来了前所未有的变革。你是否还在为宿舍的水龙头漏水、图书馆的灯光闪烁而烦恼?你是否还在为报修流程繁琐、等待时间长而焦虑?今天,这一切都将成为过去式!因为一款震撼高校圈的新…

【软件开发】Web前端学习路线

本路径视频教程均来自尚硅谷B站视频,web前端课程我已经收藏在一个文件夹下,B站文件夹同时会收藏其他前端视频,感谢关注。指路:https://www.bilibili.com/medialist/detail/ml3098510045?spm_id_from333.999.list.card_medialist.…

【QT5】<总览一> QT环境搭建、快捷键及编程规范

文章目录 前言 一、简单介绍QT 二、安装QT Creator 三、第一个QT项目 四、常用快捷键 五、QT中的编程规范 前言 在嵌入式Linux应用层开发时,经常使用QT作为图形化界面显示工具。为学习Linux下的QT编程,在Ubuntu和开发板中搭建QT开发环境&#xff…

TMS320F280049 ECAP模块--应用(2)

例1-上升沿触发 如下图所示,evt1-4设置为上升沿触发,在每个上升沿ctr值依次加载到cap1-4. 例2-上升下降沿触发 每个边沿都可选为事件,每次事件到来,依次把ctr加载到cap1-4。 例3-差异模式下上升沿触发 差异模式下每次事件到来时…

Qt_C++ RFID网络读卡器Socket Udp通讯示例源码

本示例使用的设备&#xff1a; WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QHostInfo> #include <QNetworkInterface> #include <…

java实现rar格式转换为zip

maven 依赖 <dependency><groupId>com.github.junrar</groupId><artifactId>junrar</artifactId><version>7.5.4</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutoo…

XSS 跨站脚本攻击预防(文件上传)

XSS 跨站脚本攻击预防&#xff08;文件上传&#xff09; 注意&#xff1a;可以根据需求自定义&#xff0c;改造为拦截器、或者 AOP 等方式实现 import cn.hutool.extra.spring.SpringUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.w…