FastAPI学习大纲

2023-09-21 20:13:46

FastAPI是一个现代的、快速的(高性能的)、基于标准Python类型的Web框架,用于构建APIs。它基于标准的Python类型提示,并且它的主要优点是速度、类型安全以及自动的API文档生成。

如果您要使用FastAPI,以下是一些必须了解的关键点及相关命令:

  1. 安装:

    pip install fastapi[all]
    pip install uvicorn
    
    • fastapi[all]:安装FastAPI及其所有依赖。
    • uvicorn:ASGI服务器,用于运行FastAPI应用。
  2. 创建一个基础API:

    from fastapi import FastAPI
    
    app = FastAPI()
    
    @app.get("/")
    def read_root():
        return {"Hello": "World"}
    

    解析: 在这个简单的例子中,我们初始化了一个FastAPI应用,并定义了一个端点。当用户GET请求根路径(/)时,它将返回{"Hello": "World"}

  3. 运行应用:

    uvicorn your_filename:app --reload
    

    解析: 使用uvicorn来运行你的FastAPI应用。your_filename:app指的是你的Python文件名和FastAPI应用实例的名字。--reload使得在开发环境中代码更改后自动重启。

  4. 路径参数和查询参数:

    @app.get("/items/{item_id}")
    def read_item(item_id: int, q: str = None):
        return {"item_id": item_id, "q": q}
    

    解析: item_id是一个路径参数,q是一个查询参数。FastAPI会自动验证类型,并在文档中展示。

  5. 请求体:
    从Pydantic模型中导入数据结构,并使用它来验证请求体。

    from pydantic import BaseModel
    
    class Item(BaseModel):
        name: str
        description: str = None
        price: float
    
    @app.post("/items/")
    def create_item(item: Item):
        return item
    

    解析: 使用Pydantic模型,可以自动验证请求数据、序列化和反序列化,且FastAPI会自动生成相关的API文档。

  6. 自动API文档:
    访问 /docs 以查看自动生成的Swagger界面,或访问 /redoc 以查看Redoc界面。

【提醒】以上只是FastAPI的一些基础内容。该框架还提供了许多高级功能,如依赖注入、安全性和OAuth2、事件钩子等。为了充分利用FastAPI,建议深入阅读其官方文档。

  1. 依赖注入:

    FastAPI 使用一个非常强大的依赖注入系统。它允许你很容易地管理和控制数据库连接、配置等。

    示例:

    def get_db():
        db = "Some DB connection"
        try:
            yield db
        finally:
            db.close()
    
    @app.get("/items/")
    def read_items(db=Depends(get_db)):
        return {"items": "Items from " + db}
    

    解析: get_db 是一个依赖函数,每次请求时都会调用它。read_items 依赖于 get_db 函数,所以 get_db 会先执行。

  2. 安全性:

    FastAPI 提供了多种安全和身份验证选项,包括基于密码的身份验证、OAuth2、Bearer tokens 等。

    示例 (使用HTTP Basic认证):

    from fastapi import Depends, HTTPException
    from fastapi.security import HTTPBasic, HTTPBasicCredentials
    
    security = HTTPBasic()
    
    def get_current_user(credentials: HTTPBasicCredentials = Depends(security)):
        if credentials.username != "alice" or credentials.password != "password":
            raise HTTPException(status_code=400, detail="Incorrect email or password")
        return credentials.username
    
    @app.get("/users/me")
    def read_current_user(username: str = Depends(get_current_user)):
        return {"username": username}
    

    解析: 这个示例中使用了HTTP Basic身份验证。如果用户名和密码不匹配,它会返回一个HTTP 400错误。

  3. OAuth2:

    OAuth2 是一个授权框架,FastAPI 提供了对其的支持。

    示例 (使用Password模式):

    from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
    
    oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
    
    @app.post("/token")
    def login(form_data: OAuth2PasswordRequestForm = Depends()):
        if form_data.username != "alice" or form_data.password != "password":
            raise HTTPException(status_code=400, detail="Incorrect username or password")
        return {"access_token": form_data.username, "token_type": "bearer"}
    
    @app.get("/users/me")
    def read_current_user(token: str = Depends(oauth2_scheme)):
        return {"token": token}
    

    解析: 用户需要首先通过 /token 端点使用其用户名和密码获取令牌,然后该令牌可以用于后续的请求。

  4. 事件钩子:

    FastAPI 提供了事件“钩子”或回调,允许在应用启动和关闭时执行代码。

    示例:

    @app.on_event("startup")
    async def startup_event():
        app.state.database = "Some database connection"
    
    @app.on_event("shutdown")
    async def shutdown_event():
        app.state.database.close()
    

    解析: 在应用启动时,startup_event 函数会被调用,并且可以设置应用状态,例如数据库连接。同样,在应用关闭时,shutdown_event 函数会被调用,可以用来关闭资源,例如数据库连接。

这些只是FastAPI特性的简短概述。要充分理解和利用它们,建议查阅FastAPI的官方文档,它为每个特性提供了详细的解释和示例。

更多推荐

基于海康Ehome/ISUP接入到LiveNVR实现海康摄像头、录像机视频统一汇聚,做到物联网无插件直播回放和控制

LiveNVR支持海康NVR摄像头通EHOME接入ISUP接入LiveNVR分发视频流或是转GB281811、海康ISUP接入配置2、海康设备接入2.1、海康EHOME接入配置示例2.2、海康ISUP接入配置示例3、通道配置3.1、直播流接入类型海康ISUP3.2、海康ISUP设备ID3.3、启用保存3.4、接入成功4

java---jar详解

一、helpC:\Users\lichf1>jar用法:jar{ctxui}[vfmn0PMe][jar-file][manifest-file][entry-point][-Cdir]files...选项:-c创建新档案-t列出档案目录-x从档案中提取指定的(或所有)文件-u更新现有档案-v在标准输出中生成详细输出-

计算机竞赛 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录0前言1课题背景2实现效果3卷积神经网络3.1卷积层3.2池化层3.3激活函数:3.4全连接层3.5使用tensorflow中keras模块实现卷积神经网络4YOLOV56数据集处理7模型训练8最后0前言🔥优质竞赛项目系列,今天要分享的是🚩**基于深度学习的自动驾驶车道线检测算法研究与实现**该项目较为新颖

Layui快速入门之第十五节 表格

目录一:基本用法1.引入layui的css和js2.定义一个table标签3.定义user.json数据接口二:数据渲染API方法配置渲染模板配置渲染静态表格渲染静态表格转换已知数据渲染三:表格参数基础属性异步属性返回数据中的特定字段表头属性自定义分页四:监听工具栏事件获取选中行设置行选中状态2.8+获取当前页接口数据

docker run:--privileged=true选项解析(特权模式:赋予容器几乎与主机相同的权限)

文章目录Docker的--privileged=true选项1.Docker容器的安全性1.1LinuxNamespace和Capabilities1.2限制和权限2.Docker的--privileged=true选项2.1--privileged=true的作用2.2--privileged=true的风险3.结论

大数据之Hive

Hive入门Hive是FaceBook开源,基于Hadoop的一个数据仓库工具,可以将结构化的数据映射为一张表,并提供类SQL查询功能。结构化数据是指没有表名和列名的数据文件,映射为一张表就是给这个数据添加表名和列名,让开发人员后续实现需求时只需使用类似SQL的代码来查询数据。Hive本质是一个Hadoop客户端,将H

第30章_瑞萨MCU零基础入门系列教程之IRDA红外遥控实验

本教程基于韦东山百问网出的DShanMCU-RA6M5开发板进行编写,需要的同学可以在这里获取:https://item.taobao.com/item.htm?id=728461040949配套资料获取:https://renesas-docs.100ask.net瑞萨MCU零基础入门系列教程汇总:https://b

【Hierarchical Coverage Path Planning in Complex 3D Environments】

HierarchicalCoveragePathPlanninginComplex3DEnvironments复杂三维环境下的分层覆盖路径规划视点采样全局TSP算法分两层,一层高级一层低级:高层算法将环境分离多个子空间,如果给定体积中有大量的结构,则空间会进一步细分。全局TSP问题;低层算法采用简单的采样路径规划,解决

Go语言简介:历史背景、发展现状及语言特性

一、简述Go语言背景和发展1.软件开发的新挑战多核硬件架构超大规模分布式计算集群Web模式导致的前所未有的开发规模和更新速度2.Go的三位创始人RobPikeUnix的早期开发者UTF-8创始人KenThompsonUnix的创始人C语言创始人1983年获图灵奖RobertGriesemerGoogleV8JSEngi

【C++】动态内存管理 ⑤ ( 基础数据类型数组 内存分析 | 类对象 内存分析 | malloc 分配内存 delete 释放 | new 分配内存 free 释放内存 )

文章目录一、基础数据类型数组内存分析1、malloc分配内存delete释放内存2、new分配内存free释放内存二、类对象内存分析1、malloc分配内存delete释放内存2、new分配内存free释放内存博客总结:C语言中使用malloc分配的内存,使用free进行释放;C++语言中推荐使用new分配的内存,使用

【测试开发】基础篇 · 专业术语 · 软件测试生命周期 · bug的描述 · bug的级别 · bug的生命周期 · 处理争执

【测试开发】基础篇文章目录【测试开发】基础篇1.软件测试生命周期1.1软件生命周期1.2软件测试生命周期2.描述bug3.如何定义bug的级别3.1为什么要对bug进行级别划分3.2bug的一些常见级别4.bug的生命周期5.产生争执这么怎么办(处理人际关系)6.如何开始第一次测试7.测试的执行和bug管理8.如何发现

热文推荐