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
    }
    
相关推荐
爱音乐的marlon1 天前
FastAPI 学习笔记03|core 核心层:config 是总控制台,database 是整个工程的地基
笔记·学习·fastapi
花酒锄作田1 天前
Repository 模式在 FastAPI 中的应用
python·fastapi
喜欢的名字被抢了2 天前
FastAPI 接口安全与工程化 JWT、测试和配置管理
安全·fastapi
Maiko Star3 天前
从零落地「AI掘金头条」新闻模块:FastAPI + SQLAlchemy 异步实战
python·fastapi
喜欢的名字被抢了3 天前
FastAPI 接入异步 PostgreSQL 完成任务 CRUD 与数据库迁移
数据库·postgresql·fastapi
Esaka_Forever3 天前
uvicorn main.py 命令说明
fastapi
巴啦啦小魔仙变身4 天前
FastAPI 01 Create Demo
python·fastapi
李昊哲小课5 天前
fastapi sse websocket 奶茶店实时订单看板
人工智能·python·websocket·网络协议·fastapi·sse
李昊哲小课6 天前
fastapi sse websocket 智能家居实时控制台
python·websocket·智能家居·fastapi·sse
赵广陆6 天前
SQLAlchemy ORM 超全教程
python·fastapi