PythonWeb框架库之fastapi使用详解


概要

Python是一门广受欢迎的编程语言,用于构建各种类型的Web应用程序。FastAPI是一个现代、高性能的Web框架,它以简单的方式提供了快速构建API的能力。本文将介绍FastAPI的各种功能和用法,并提供丰富的示例代码,帮助大家开始使用这个强大的工具。


什么是FastAPI?

FastAPI是一个基于Python的现代Web框架,专注于构建API。它的设计目标是提供高性能、易用性和直观性,同时可以使用标准的Python类型注解来定义请求和响应模型。FastAPI支持异步编程,使得处理大量并发请求变得更加容易。

安装FastAPI

要开始使用FastAPI,首先需要安装它。

可以使用pip来安装FastAPI和uvicorn(用于启动Web服务器):

pip install fastapi uvicorn

创建一个简单的FastAPI应用

从一个简单的示例开始,创建一个FastAPI应用。以下是一个简单的示例,创建一个返回 "Hello, FastAPI!" 的API。

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello, FastAPI!"}

在上面的代码中,导入FastAPI模块并创建一个应用实例。然后,使用@app.get("/")装饰器定义了一个路由,指定了HTTP GET请求的处理函数。当访问根路径("/")时,将调用read_root函数并返回JSON响应。

请求和响应模型

FastAPI可以使用Python类型注解来定义请求和响应模型,这使得处理数据变得非常简单。

以下是一个示例,演示如何定义请求和响应模型:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float

@app.post("/items/")
async def create_item(item: Item):
    return item

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

在上面的示例中,首先定义了一个Item模型,它继承自BaseModel,并具有nameprice字段。然后,使用@app.post("/items/")装饰器定义了一个路由,接受一个Item类型的参数,并返回该参数作为响应。另外,还定义了一个带有路径参数和查询参数的GET请求路由,演示了如何处理不同类型的请求。

异步支持

FastAPI支持异步编程,这意味着可以编写异步的请求处理函数,以处理大量并发请求。

以下是一个示例,展示了如何编写异步的路由处理函数:

from fastapi import FastAPI
import asyncio

app = FastAPI()

@app.get("/")
async def read_root():
    await asyncio.sleep(1)  # 模拟异步操作
    return {"message": "Hello, FastAPI!"}

在上面的示例中,使用async关键字定义了read_root函数,然后使用await来模拟异步操作。这使得FastAPI非常适合处理高并发的应用程序。

身份验证和授权

FastAPI还提供了内置的身份验证和授权支持,使得保护您的API变得更容易。可以使用FastAPI的Depends类来定义依赖项,以验证用户身份和授权访问。

以下是一个示例,演示如何使用依赖项来验证用户的API密钥:

from fastapi import FastAPI, Depends, HTTPException
from pydantic import BaseModel

app = FastAPI()

class User(BaseModel):
    username: str
    api_key: str

def get_current_user(api_key: str = Depends(User.api_key)):
    # 在数据库或其他存储中验证API密钥
    if api_key != "valid_api_key":
        raise HTTPException(status_code=401, detail="Invalid API Key")
    return User(username="user")

@app.post("/items/")
async def create_item(item: Item, current_user: User = Depends(get_current_user)):
    # 只有验证通过的用户才能创建项目
    return item

在上面的示例中,定义了一个get_current_user函数,它是一个依赖项,用于验证用户的API密钥。如果API密钥无效,将引发HTTP异常。然后,在create_item路由中使用Depends来注入current_user参数,以验证用户是否有权创建项目。

WebSocket支持

除了HTTP请求,FastAPI还支持WebSocket协议,可以构建实时应用程序。

以下是一个示例,演示如何创建WebSocket路由:

from fastapi import FastAPI, WebSocket

app = FastAPI()

@app.websocket("/ws/{client_id}")
async def websocket_endpoint(websocket: WebSocket, client_id: int):
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await websocket.send_text(f"Message text was: {data}")

在上面的示例中,使用@app.websocket("/ws/{client_id}")装饰器定义了一个WebSocket路由,接受来自客户端的消息并将其回传。

部署FastAPI应用

部署FastAPI应用非常容易。可以使用ASGI服务器(例如uvicorn)来运行应用。

以下是一个简单的示例:

uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4

在上面的命令中,main是应用的Python文件名,app是FastAPI应用的实例。可以根据需要指定主机、端口和工作进程数。

总结

FastAPI是一个出色的Python Web框架,它提供了高性能、易用性和直观性,使得构建API变得非常简单。通过本文的介绍,已经了解了FastAPI的各种功能和用法,可以开始使用它来构建强大的Web应用程序。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/366603.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

帮管客CRM 文件上传漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

指针+一维整型数组的基本运用 和 指针+一维整型数组的初步学习

一,调式程序的技巧: 1.明确问题 2.定位问题 3.加打印(打印核心数据0) 二,指针的回顾 1.指针的概念:指针就是地址(内存单元的编号),是一个数据类型(指针类型…

使用 Dockerfile 定制镜像详解

使用 Dockerfile 定制镜像详解 1.DockerfileFROM 指定基础镜像RUN 执行命令构建镜像 2.COPY 复制文件3.ADD 更高级的复制文件4.CMD 容器启动命令5.ENTRYPOINT 入口点6.ENV 设置环境变量7.ARG 构建参数8.VOLUME 定义匿名卷9.EXPOSE 暴露端口10.WORKDIR 指定工作目录11.USER 指定…

【Django】如何设置支持多语种网站,中文/英文网站

首先,需要明确一点:我们要实现的中英对照翻译,这个翻译不是浏览器翻译的,也不是Django帮你翻译。这个需要你自己事先手动翻译好,存放在专门翻译文件中,Django只是事后调用而已。 第一步 新建项目后&#x…

Python||五城P.M.2.5数据分析与可视化_使用华夫图分析各个城市的情况(中)

目录 1.上海市的空气质量 2.成都市的空气质量 【沈阳市空气质量情况详见下期】 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成都市,使用华夫图和柱状图分析各个城市的情况 1.上海市的空气质量 import numpy as np import pandas as pd impor…

【毕业日记】2024.01 - 慢下来,静待花开

转眼距离930离开鹅厂已经120天了,我是很能拖延的,或者是很懂自我麻痹的,这三个多月,一直想要写点东西纪念,一直拖一直拖一直拖…… 疫情这几年经济下行里裁员是个茶余饭后“嬉笑”之余经常被提起的词,部门滚…

JVM 笔记

JVM HotSpot Java二进制字节码的运行环境 好处: 一次编写,到处运行自动内存管理,具有垃圾回收功能数组下标越界检查多态(虚方法表) JVM组成 类加载子系统(Java代码转换为字节码)运行时数据…

【代码随想录-链表】环形链表

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

GEDepth:Ground Embedding for Monocular Depth Estimation

参考代码:gedepth 出发点与动机 相机的外参告诉了相机在世界坐标系下的位置信息,那么可以用这个外参构建一个地面基础深度作为先验,后续只需要在这个地面基础深度先验基础上添加offset就可以得到结果深度,这样可以极大简化深度估…

【前端web入门第三天】02 CSS字体和文本

文章目录: 1.字体 1.1 字体大小 1.2 字体粗细 1.3 字体样式 1.4 行高 1.5 字体族 1.6 font 复合属性 2. 文本 2.1 文本缩进2.2 文本对齐方式2.3 文本修饰线2.4 color文字颜色 1.字体 1.1 字体大小 属性名: font-size属性值:文字尺寸,PC端网页最常用的单位px …

8. Threejs案例-SVG渲染器和WEBGL渲染器对比

8. Threejs案例-SVG渲染器和WEBGL渲染器对比 实现效果 知识点 SVG渲染器 (SVGRenderer) SVGRenderer 被用于使用 SVG 来渲染几何数据,所产生的矢量图形在以下几个方面十分有用: 动画标志 logo 或者图标 icon可交互的 2D 或 3D 图表或图形交互式地图复…

6、应急响应-日志自动提取自动分析ELKLogkitLogonTracerAnolog等

用途:个人学习笔记,欢迎指正 目录 背景: 一、日志自动提取-七牛Logki&观星应急工具 1、七牛Logkit: (支持Windows&Linux&Mac等) 2、观星应急工具(只支持Windows) 二、日志自动分析-Web-360星图&Goaccess&ALB&Anolog 1、W…

Pandas.Series.var() 方差 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本: 本文基于 pandas2.2.0 编写。 关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。 传送门: Pandas API参考目录 传送门: Pandas 版本更新及新特性 传送门&…

vit细粒度图像分类(六)FBSD学习笔记

1.摘要 从判别局部区域学习特征表示在细粒度视觉分类中起着关键作用。利用注意机制提取零件特征已成为一种趋势。然而,这些方法有两个主要的局限性:第一,它们往往只关注最突出的部分,而忽略了其他不明显但可区分的部分。其次,他们…

从零搭建Vue3 + Typescript + Pinia + Vite + Tailwind CSS + Element Plus开发脚手架

项目代码以上传至码云,项目地址:https://gitee.com/breezefaith/vue-ts-scaffold 文章目录 前言脚手架技术栈简介vue3TypeScriptPiniaTailwind CSSElement Plusvite 详细步骤Node.js安装创建以 typescript 开发的vue3工程集成Pinia安装pinia修改main.ts创…

图解Vue组件通讯【一图胜千言】

Vue的每个组件都有独自的作用域,组件间的数据是无法共享的,但实际开发工作中我们常常需要让组件之间共享数据,今天我们来学习下面三种组件通信方式: 父子组件之间的通信 兄弟组件之间的通信 祖先与后代组件之间的通信 1. 父子组件…

MySQL进阶之锁(全局锁以及备份报错解决)

锁 全局锁 全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语 句,已经更新操作的事务提交语句都将被阻塞。 其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定&#xff…

Windows篇|连接共享文件夹映射驱动器教程

前言 昨天给小伙伴们分享了如何设置Windows共享文件夹的教程 超简单设置Windows共享文件夹,传输文件无烦恼 A电脑设置完共享文件夹之后,只要在同一局域网下,所有的电子设备都可以连接访问A电脑的共享文件夹里的内容。 这样就省去了U盘传输的麻烦,只要A电脑开着机,文件放入…

Mac如何设置一位数密码?

一、问题 Mac如何设置一位数密码? 二、解答 1、打开终端 2、清除全局账户策略 sudo pwpolicy -clearaccountpolicies 输入开机密码,这里是看不见的,输入完回车即可 3、重新设置密码 (1)打开设置-->用户和群组…

Docker 容器卷

1、概念介绍 如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了,如果要开启,我们一般使用--privlegedtrue命令,扩大…