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
    }
    
相关推荐
dangfulin2 小时前
fastapi+sqlalchemy实现一对一、一对多、多对多关系数据操作
fastapi
龙腾AI白云6 小时前
【基于Transformer的人工智能模型搭建与fine-tuning】
scikit-learn·fastapi
叼奶嘴的超人1 天前
手动创建Docker版Fastapi CI/CD镜像文件
ci/cd·docker·fastapi
regret~1 天前
【笔记】Ant Design+FastAPI 项目 Linux 服务器内网部署完整笔记
服务器·笔记·fastapi
regret~1 天前
【笔记】Ant Design(含Umi Max)+FastAPI 内网部署&接口代理 核心笔记
笔记·fastapi
全栈测试笔记2 天前
FastAPI系列(12):响应模型参数
开发语言·python·fastapi
叼奶嘴的超人2 天前
Fastapi之UV安装方式与使用方式
fastapi·uv
强化试剂瓶3 天前
Silane-PEG8-DBCO,硅烷-聚乙二醇8-二苯并环辛炔技术应用全解析
python·flask·numpy·pyqt·fastapi
曲幽3 天前
FastAPI日志实战:从踩坑到优雅配置,让你的应用会“说话”
python·logging·fastapi·web·error·log·info
布局呆星4 天前
FastAPI:高性能Python Web框架
fastapi