fastapi日记:二.跑通第一个Demo

前言

本节运行一个简单的Demo,了解下简单的项目结构。
由于非常缺乏后端知识可能会记录一些相关名词的解释,也请大佬赐教;至于觉得碎碎念,请包容[doge]。

Demo结构说明

Demo主要展示从数据库到接口请求的简单过程。
下图是对Demo结构的简单说明,不代表成熟后端的结构。
从下到上依次是
数据库服务:提供持久化数据服务
models(映射数据库的表结构,属性完全和数据库表中的一样)
crud(对数据的增删改查)
schemas(对数据的规划,说人话就是数据库中对表的一种遮遮掩掩,给对方想看到的数据;比如在首页的文章推荐中,一条文章推荐只包含标题、简介、作者等信息,点到文章页面才有完整的数据)
main(main当中在实例里负责与客户端交互,花式提供数据服务)
数据库服务
在这里插入图片描述

代码跑起来

fastapi用了sqlachemy。Python中最有名的ORM框架,ORM对象关系映射,简单点说就是把对数据库的表映射到对象上,对数据库的操作也映射到对象上,不用写很多随业务逻辑变化而增加的sql代码。
所以只用配置好数据库服务、设计好数据表就能直接使用,不用编写sql脚本。
第一步配置数据库服务,这里使用SQLite(SQLite 教程 SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。),只需简单配置就可以直接使用的数据库服务;之后可以使用其他稍大型的数据库服务如myslq、postgresql等。
展示代码,其中有较为详细的注释
代码结构,由5个文件组成。
1.database.py
2.models.py
3.schemas.py
4.crud.py
5.main.py
在这里插入图片描述
#database.py
此部分用来设置数据库服务,以及产生操作数据库所用的会话。

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# 数据库服务配置
DATABASE_URL  = "sqlite:///./test.db"
# 创建数据引擎(对连接池和数据库方言的管理维护)
engine = create_engine(
    DATABASE_URL , connect_args={"check_same_thread": False}
)
# 获取数据库会话maker也就是负责生成会话的
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 与数据库表一至的所有models的父类,完成table与model类之间的映射
# declarative_base工厂方法构造的声明系统
Base = declarative_base()

# Dependency,依赖,也就是每次都需要,每次经过此方法就产生一个db会话
# 之后在操作数据库时会用到
def get_db():
    try:
        db = SessionLocal()
        yield db
    finally:
        db.close()

#models.py
相当于数据库中表的结构
此处就一个很简单的表结构
之后的教程中有更复杂的表结构
每个model类其实就对应了一个数据库中的一张表

from sqlalchemy import  Column, Integer, String

# 从database中获取Base基类
from test.database import Base

# One表的model类
class One(Base):
    # 表名为one
    __tablename__ = "one"
    # id字段,int类型,设置为主键,设置为索引
    id = Column(Integer, primary_key=True, index=True)
    # name字段,长度为50的字符串,默认值为gouzi
    name = Column(String(50), default="gouzi")

下图是运行代码后自动生成的,不需要创建表,当把所有代码写完运行后就会生成。
在这里插入图片描述
#schemas.py

from pydantic import BaseModel

# 此视图用来创建一条one记录
# 因为插入一条新记录时id是数据库自动生成的,所以创建一条记录时无需id
class CreateOne(BaseModel):
    name: str
    class Config:
        # 用来说明是orm模型
        orm_mode = True

# 拥有全部字段的one模型,可用来更新,也可以查询时使用
class One(CreateOne):
    id: int

#crud.py
crud主要汇聚了一堆增删改查操作
此处只有查询和插入,后续再展示更多操作

from sqlalchemy.orm import Session
from test import models, schemas

# 根据id查出一条记录
def get_one(db: Session, id: int):
    # 用id来过滤出one表中的一条记录
    return db.query(models.One).filter(models.One.id == id).first()

# 获得一组one记录
def get_ones(db: Session, skip: int = 0, limit: int = 100):
    # 获得从skip到skip+limit的一组one记录
    return db.query(models.One).offset(skip).limit(limit).all()

# 创建one表中的一条记录,也就是插入一条数据
def create_one(db: Session, user: schemas.CreateOne):
    # 将传入的user映射到一个one模型里
    db_user = models.One(**user.dict())
    # 向数据库中添加一条记录
    db.add(db_user)
    # 提交我们对数据的操作
    db.commit()
    # 刷新一下
    db.refresh(db_user)
    return db_user

#main.py
此处主要汇聚一些可以和客户端交互的接口
而这些接口处理逻辑时,会用到以上所示的代码

from typing import List
from fastapi import Depends, FastAPI
from sqlalchemy.orm import Session
from test import schemas, crud
from test.database import engine, Base, get_db

# 将元数据创建一下,此时可将model对应的书库表创建好
Base.metadata.create_all(bind=engine)

# 创建一个FastAPI实例
app = FastAPI()


# 创建一条记录,使用post方法,路由为/one/
@app.post("/one/", response_model=schemas.CreateOne)
def create_user(one: schemas.CreateOne, db: Session = Depends(get_db)):
    db_user = crud.create_one(db, one)
    return db_user


# 查询一组one记录
@app.get("/ones/", response_model=List[schemas.One])
def read_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
    ones = crud.get_ones(db, skip=skip, limit=limit)
    return ones


# 根据id查询一条记录
@app.get("/one/", response_model=schemas.One)
def read_user(id: int, db: Session = Depends(get_db)):
    one = crud.get_one(db, id)
    return one


if __name__ == '__main__':
    import uvicorn
    # 使用uvicorn创建我们的服务
    uvicorn.run(app, host="127.0.0.1", port=8000)


运行代码

代码走起>
我是用pycharm开发的,配置下就可直接跑起来
配置大概长这个样子,随便配下就可以
在这里插入图片描述打开浏览器就可使用swagger式的接口文档了,还可以直接访问接口
在这里插入图片描述

另外还有一种格式的接口文档,访问http://127.0.0.1:8000/redoc

点开每个请求
可以直接发送请求
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值