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
    }
    
相关推荐
龙腾AI白云17 小时前
【具身智能】
fastapi
k***121721 小时前
开源模型应用落地-FastAPI-助力模型交互-进阶篇-中间件(四)
开源·交互·fastapi
花酒锄作田2 天前
[python]FastAPI-Tracking ID 的设计
python·fastapi
8***v2573 天前
开源模型应用落地-FastAPI-助力模型交互-进阶篇-中间件(四)
开源·交互·fastapi
逻极4 天前
FastAPI项目结构实战:从混乱到清晰,我们如何提升团队开发效率300%
fastapi·架构设计·项目结构·代码组织
yaoty6 天前
FastAPI 流式响应中,如何优雅处理客户端断连后的数据库操作?
mysql·fastapi
数据知道6 天前
Django基础项目:从零到一搭建用户管理系统
python·django·python web·python项目
百***49007 天前
开源模型应用落地-FastAPI-助力模型交互-进阶篇-中间件(四)
开源·交互·fastapi
数据知道8 天前
【Flask】一文掌握 Flask 基础用法
数据库·后端·python·flask·python web