fastapi 基础介绍

文章目录

框架介绍

参考文档

  • 现代、高性能的python web服务框架,用于构建API;
  • 基于异步IO实现并发,性能接近node.js、go;
  • 基于starlette异步web框架,使用pydantic实现数据验证、数据过滤、数据序列化等;
  • 使用uvicorn (ASGI)异步服务网关,支持高并发;
  • 类型提示,提升开发效率、IDE的信息提示;
  • 自动生成API文档,内置Swagger UI 、ReDoc
  • 使用sqlalchemy 实现ORM的数据库操作;

创建虚拟环境

为了避免多个项目的依赖版本冲突,最好为每个项目单独创建一个虚拟环境,且不影响系统环境;
python方式:

bash 复制代码
# 创建环境
python -m venv fastapi_env

cd fastapi_env/Scripts/
# 激活环境
activate
# 取消激活
deactivate

如下虚拟环境已激活:

anaconda方式(需要安装anaconda)

bash 复制代码
conda create -n fastapi_env
conda activate fastapi_env
conda deactivate

在python的虚拟环境中就可以安装要使用的包;

bash 复制代码
(fastapi_env) >pip install fastapi uvicorn
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple/
Collecting fastapi

第一个案例

  1. 创建一个目录,使用pycharm打开并配置虚拟环境
  2. 创建目录结构
python 复制代码
# app.py
# __author__ = "laufing"
from fastapi import FastAPI


app = FastAPI()


# 注册路由
@app.get("/")
def index():
    return "hello world"

@app.get("/info")
def info():
    return {
        "code": 200,
        "message": "ok"
    }


if __name__ == '__main__':
    # python脚本方式运行服务
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=5050)

    # 开启reload模式
    # uvicorn.run("app.app:app", host="0.0.0.0", port=5050, reload=True, reload_dirs=[".", "../"])
	
		# uvicorn命令行方式启动服务,通过PYTHONPATH搜索app
		#(fastapi_env) C:\Desktop\lauf>uvicorn app.app:app --host localhost --port 5050 --reload

浏览器中访问接口:

请求数据解析

python 复制代码
# __author__ = "laufing"
from fastapi import FastAPI


app = FastAPI()


# 注册路由
@app.get("/")
def index():
    return "hello world"

@app.get("/info")
def info():
    return {
        "code": 200,
        "message": "ok"
    }


from fastapi import Query
# 查询参数解析
@app.get("/user/users/")
def get_users(num: int = Query(), page: int = Query(default=None, alias="pageSize", ge=0, lt=10000, description="页码")):
    # num, page 均从从Query查询参数中解析, pageSize参数路径地址中的别名
    # min_length/max_length
    # regex = r"^1[a-z]$"
    return {
        "code": 200,
        "page": page
    }


from fastapi import Request
from pydantic import BaseModel, Field
from typing import Any
class UserSchema(BaseModel):
    name: str
    pwd: str

# 请求体数据的解析
@app.post("/user/users/")
def create_user(user: UserSchema):  # pydantic类从请求体中解析数据
    return {
        "code": 200,
        "data": user
    }


from enum import Enum
class UserIdEnum(Enum):
    A = "a"
    B = "b"
    C = "c"

# 路径参数解析
@app.get("/user/{user_id}/")
def get_user(user_id: UserIdEnum): # 从路径中匹配出user_id,根据类型注释转为int
    # 路径参数验证使用Path 或者枚举类
    return {
        "code": 200,
        "msg": user_id
    }



# 自定义验证方法 (实现复杂的验证逻辑)
def validate(value: str):
    if not value.startswith("lauf"):
        raise ValueError("数据格式不符合要求")
    return value
from typing_extensions import Annotated
from pydantic import BeforeValidator  # 在验证器之前执行
# 创建一个字符串的类
Info = Annotated[str, BeforeValidator(validate)]
@app.get("/user/info/{info}")
def info(info: Info):
    return {
        "code": 200,
        "data": info
    }




if __name__ == '__main__':
    # python脚本方式运行服务
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=5050)

    # 开启reload模式
    # uvicorn.run("app.app:app", host="0.0.0.0", port=5050, reload=True, reload_dirs=[".", "../"])

pydantic的数据验证

  • Field 自带的参数验证;
  • field_validator 验证装饰器,用于自定义验证逻辑
python 复制代码
from pydantic import BaseModel, Field, field_validator
from typing import Any


class UserSchema(BaseModel):
    name: str = Field(..., min_length=3, max_length=10, description="用户名", example="jack")
    pwd: str = Field(..., pattern=r"[a-zA-Z0-9]", title="密码")  # 正则验证
    email: str

    # 自定义验证函数
    @field_validator("email")
    def my_validator(cls, v):
        # cls 是UserSchema类
        # v 是邮箱字符串
        if "@" not in v:
            raise ValueError("自定义:邮箱格式不合格")
        return v

# 请求体数据的解析
@app.post("/user/users/")
def create_user(user: UserSchema):  # pydantic类从请求体中解析数据
    return {
        "code": 200,
        "data": user
    }
    
相关推荐
你喜欢喝可乐吗?27 分钟前
FastAPI 入门笔记
笔记·fastapi
一尘之中6 小时前
Ubuntu 22.04 上 FastAPI 的完整安装与问题解决指南
ubuntu·fastapi·ai写作
PieroPc11 小时前
用FastAPI 后端 和 Vue3 前端写一个博客系统 例
前端·vue·fastapi
小北方城市网13 小时前
Python FastAPI 异步性能优化实战:从 1000 QPS 到 1 万 QPS 的踩坑之路
大数据·python·性能优化·架构·fastapi·数据库架构
simon_skywalker13 小时前
FastAPI实战笔记(七)集成 NoSQL数据库
nosql·fastapi
一碗面42119 小时前
不用第三方 API!FastAPI + PaddleOCR 自建身份证 OCR 服务实战
ocr·fastapi
Psycho_MrZhang2 天前
Django/Flask/FastAPI简要对比分析
django·flask·fastapi
曲幽2 天前
FastAPI + SQLite:从基础CRUD到安全并发的实战指南
python·sqlite·fastapi·web·jwt·form·sqlalchemy·oauth2
Psycho_MrZhang2 天前
FastAPI 设计思想总结
fastapi
七夜zippoe2 天前
依赖注入:构建可测试的Python应用架构
开发语言·python·架构·fastapi·依赖注入·反转