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
    }
    
相关推荐
许杰小刀1 天前
FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南”
前端·vue.js·fastapi
Aric_Jones2 天前
从实战理解异步、并发并行与GIL:FastAPI vs SpringBoot
java·spring boot·fastapi
不是株2 天前
FastAPI
python·fastapi
星星也在雾里2 天前
Dify + FastAPI + 讯飞WebSocket实现方言识别
人工智能·fastapi
冰河团队2 天前
一个拉胯的分库分表方案有多绝望?整个部门都在救火!
java·高并发·分布式数据库·分库分表·高性能
Ares-Wang2 天前
FastAPI 数据验证 Pydantic Flask 用 WTForms
python·flask·fastapi
曲幽3 天前
FastAPI自动生成的API文档太丑?我花了一晚上把它改成了客户愿意付费的样子
python·fastapi·web·swagger·openapi·scalar·docs
PieroPc4 天前
一个功能强大的 Web 端标签设计和打印工具,支持服务器端直接打印到局域网打印机。Fastapi + html
前端·html·fastapi
别抢我的锅包肉4 天前
FastAPI + Vue3 + Vite 跨域报错全解:从 `Access-Control-Allow-Origin missing` 到彻底修复
中间件·状态模式·fastapi
Chase_______4 天前
【FastAPI】内网/离线环境docs文档无法显示的解决方案
fastapi