快速学习Python框架FastAPI

news2024/11/8 16:34:00

FastAPI是一种现代、快速(高性能)的Web框架,用于Python 3.6+,使用Python类型提示构建API。它的设计初衷是帮助开发者在短时间内开发出高性能的API服务。FastAPI的灵感来源于许多高性能的编程框架,包括Express、Django REST Framework和Flask,但它提供了一些特定的特性和优化,使其脱颖而出。
在这里插入图片描述

什么是FastAPI?

FastAPI实现并支持了Python中的类型提示,使开发者能够在编写代码时更加高效和可靠。它不仅简化了API的开发过程,还在性能方面做出了显著贡献。FastAPI能够在多种情况下提供出色的吞吐量和低延迟,使其非常适合构建快速和可扩展的Web服务。
在这里插入图片描述

FastAPI的主要特性包括:

  • 快速:FastAPI是当前最快的Python网络框架之一,就像NodeJS和Go这样的系统语言。它使用Starlette(用于网络部分)和Pydantic(用于数据部分)进行优化。
  • 简单:开发者可以在数分钟内无痛地创建API。
  • 基于标准:遵循OpenAPI和JSON Schema标准,让我们能够自动生成交互式文档和数据验证。
  • 自动生成的交互式API文档:Swagger UI和ReDoc界面。
  • Python 3.6+类型提示让代码自动完成,极大提升开发体验。
  • 生产就绪:适合生产环境应用的代码。
安装FastAPI

在开始使用FastAPI之前,你需要确保你的Python环境已经配置好,然后你可以通过以下命令安装FastAPI:

pip install fastapi

为了运行FastAPI应用,我们还需要一个ASGI服务器,例如uvicorn:

pip install uvicorn

在这里插入图片描述

开始使用FastAPI

让我们从一个简单的示例应用开始,该应用提供了一个基本的“Hello, World!”服务。

创建一个文件名为main.py,代码如下:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"Hello": "World"}

要运行这个应用,使用以下命令:

uvicorn main:app --reload
  • main:指的是Python文件(不包括.py扩展名)。
  • app:是FastAPI实例的名字。
  • --reload:启用自动重载,在代码更改时自动重启服务器。适合开发模式使用。

打开浏览器访问http://127.0.0.1:8000,你将看到一个简单的JSON响应:{"Hello": "World"}

此外,FastAPI会为你自动生成API文档。使用Swagger UI访问http://127.0.0.1:8000/docs,或者使用ReDoc访问http://127.0.0.1:8000/redoc

定义请求方法

在这里插入图片描述

FastAPI支持几种常见的HTTP方法:GET、POST、PUT、DELETE等。让我们创建一个简单的示例,演示如何使用这些HTTP方法:

from fastapi import FastAPI

app = FastAPI()

# GET请求:获取信息
@app.get("/")
async def root():
    return {"message": "Hello World"}

# POST请求:创建新资源
@app.post("/items/")
async def create_item(item: dict):
    return {"item_name": item.get("name")}

# PUT请求:更新资源
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: dict):
    return {"item_id": item_id, "item_name": item.get("name")}

# DELETE请求:删除资源
@app.delete("/items/{item_id}")
async def delete_item(item_id: int):
    return {"item_id": item_id}

在FastAPI中,通过Python的类型提示系统,我们可以方便地定义和解析路径参数、请求体、查询参数和表单数据。

路径参数

在这里插入图片描述

FastAPI通过使用类型提示来定义路径参数:

from fastapi import FastAPI

app = FastAPI()

@app.get("/users/{user_id}")
async def read_user(user_id: int):
    return {"user_id": user_id}

在这里,路径参数user_id定义为一个整数。FastAPI会自动验证传递的参数是否为整数,并在不匹配时返回一个400错误响应。

查询参数

除了路径参数,FastAPI还支持查询参数。它们是定义在URL路径之后的可选参数,通常用于过滤和分页:

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    return {"skip": skip, "limit": limit}

/items/路径上,skiplimit是可选的查询参数,具有默认值skip=0limit=10

请求体

在这里插入图片描述

FastAPI支持请求体数据的声明和验证。通常,POST、PUT等请求会需要一个请求体:

from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

app = FastAPI()

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

在这里,我们使用Pydantic模型来定义请求体的结构和类型。FastAPI会验证和解析请求体中的数据,并将其作为参数传递给路径操作函数。

数据验证和自动文档

FastAPI利用Pydantic进行数据验证,并自动生成API文档。当你运行FastAPI应用时,它会生成两个API文档界面,分别是Swagger UI和ReDoc。
在这里插入图片描述

  • Swagger UIhttp://127.0.0.1:8000/docs – 提供了一个交互式的API文档,你可以在浏览器中测试所有API操作。
  • ReDochttp://127.0.0.1:8000/redoc – 另一个自动生成的API文档界面,风格简洁。
异步支持

FastAPI完全支持异步编程,它完全利用Python中的async和await特性。在定义路径操作函数时,可以通过async def来声明异步操作:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"Hello": "World"}

异步编程能够帮助服务器处理更多请求,使其能够更快地响应客户端,尤其在I/O密集型环境中。结合uvicorn或任何ASGI兼容服务器,FastAPI能够实现真正的并发操作。

中间件与扩展

在这里插入图片描述

中间件是一个能够在请求或响应期间处理数据的函数。FastAPI提供简单的方式来编写中间件,这有助于在应用中引入额外的功能,例如请求/响应日志、CORS处理、安全措施等。

下面是一个简单的中间件示例,用于记录请求时间:

from fastapi import FastAPI
from starlette.middleware.base import BaseHTTPMiddleware
import time

app = FastAPI()

class TimingMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        start_time = time.time()
        response = await call_next(request)
        process_time = time.time() - start_time
        response.headers["X-Process-Time"] = str(process_time)
        return response

app.add_middleware(TimingMiddleware)
CORS(跨域资源共享)

在现代Web应用开发中,CORS是一个常见的问题。FastAPI提供了一种简单的方式来处理CORS问题,你可以通过安装starlette.middleware.cors.CORSMiddleware来实现:

from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # 允许访问的源
    allow_credentials=True,
    allow_methods=["*"],    # 允许的HTTP方法
    allow_headers=["*"],    # 允许的HTTP表头
)

通过以上配置,你可以实现从不同源的客户端访问FastAPI应用。你可以根据实际需求调整允许的来源、方法和表头。

数据库集成

在这里插入图片描述

FastAPI是一个轻量级框架,可以很容易地与多种数据库集成。在构建生产级应用时,数据库是必不可少的一部分。其中SQLAlchemy是Python中常用的ORM框架,我们可以利用它与FastAPI进行集成:

首先,安装SQLAlchemy和数据库驱动:

pip install sqlalchemy
pip install databases

接下来,定义数据库配置和模型:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"

engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

class Item(Base):
    __tablename__ = 'items'

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    description = Column(String, index=True)

创建数据库会话和路径操作:

from fastapi import Depends, FastAPI, HTTPException
from sqlalchemy.orm import Session
from typing import List

app = FastAPI()

Base.metadata.create_all(bind=engine)

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.post("/items/", response_model=Item)
def create_item(item: Item, db: Session = Depends(get_db)):
    db.add(item)
    db.commit()
    db.refresh(item)
    return item

@app.get("/items/", response_model=List[Item])
def read_items(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
    items = db.query(Item).offset(skip).limit(limit).all()
    return items

在上面的代码中,我们定义了一个SQLAlchemy数据库模型,同时创建了CRUD操作,包括创建(POST)和读取(GET)功能。通过Depends依赖注入,我们将数据库会话传递给路径操作函数,使我们能够轻松管理数据库事务。

全面总结

FastAPI是一个强大且高效的Web框架,适合从小型项目到大型企业级应用的各种开发需求。因为它的自动文档、数据验证和优秀的性能,FastAPI在编写现代Web服务时提供了巨大的便捷性。结合异步、CORS、中间件和数据库集成功能,FastAPI能够帮助开发者快速构建稳健的API服务。我们强烈推荐在你的下一个项目中试用FastAPI,并享受其带来的高效开发体验。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

scala Map集合

一.Map的概述 Map是一种存储键值对的数据结构,Map中的键都是唯一的。 idea实例 二.Map的常见操作 idea实例 三.Map中的查询元素 idea实例 四.Map的常用方法 idea实例 五.Map的遍历 idea实例

Zabbix监控架构

目录 1. Zabbix监控架构-CS架构 2. Zabbix极速上手指南 主机规划 2.1 部署ngxphp环境并测试 检查安装结果 2.2 部署数据库 2.3 编译安装zabbix-server服务端及后续配置 2.4 部署前端代码代码进行访问 前端的配置文件(连接数据库与主机名等信息) 2.5 欢迎来到zabbix 2…

基于vue+neo4j 的中药方剂知识图谱可视化系统

前言 历时一周时间,中药大数据R02系统中药开发完毕,该系统通过scrapy工程获取中药数据,使用python pandas预处理数据生成知识图谱和其他相关数据,利用vuespringbootneo4jmysql 开发系统,具体功能请看本文介绍。 简要…

Java——》try-with-resource

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

数据结构---二叉树(顺序结构),堆(上)

树 树的概念与结构 树是⼀种⾮线性的数据结构,它是由 n(n>0) 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。 PS 有⼀个特殊的结点&#xff…

蓝桥杯-网络安全比赛题目-遗漏的压缩包

小蓝同学给你发来了他自己开发的网站链接, 他说他故意留下了一个压缩包文件,里面有网站的源代码, 他想考验一下你的网络安全技能。 (点击“下发赛题”后,你将得到一个http链接。如果该链接自动跳转到https,…

HTB:Busqueda[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机进行开放端口扫描 使用ffuf对该域名进行路径FUZZ 直接使用浏览器访问靶机80端口主页面 直接到Github上寻找相关PoC、EXP USER_FLAG:0f2686aebbdb4c728050281a6fb742cf 特权提升 ROOT_FLAG:dde68ef…

如何创建备份设备以简化 SQL Server 备份过程?

SQL Server 中的备份设备是什么? 在 SQL Server 中,备份设备是用于存储备份数据的物理或逻辑介质。备份设备可以是文件、设备或其他存储介质。主要类型包括: 文件备份设备:通常是本地文件系统中的一个或多个文件。可以是 .bak 文…

c语言-8进制的表示方法

文章目录 一、8进制二、输出格式三、范围限制四、八进制的负数五、程序 一、8进制 在C语言中,表示8进制数需要使用前缀数字0,而不是通常的o或者0x. 8进制数以数字0作为前缀,后面跟着一串八进制数字(0-7)组成&#xf…

python操作MySQL以及SQL综合案例

1.基础使用 学习目标:掌握python执行SQL语句操作MySQL数据库软件 打开cmd下载安装 安装成功 connection就是一个类,conn类对象。 因为位置不知道,所以使用关键字传参。 表明我们可以正常连接到MySQL 演示、执行非查询性质的SQL语句 pytho…

【含开题报告+文档+源码】基于SSM的物流管理系统设计与实现

开题报告 随着电子商务的迅猛发展和人们生活水平的提高,快递服务行业正经历着前所未有的增长。占航快递公司作为国内知名的快递企业之一,面临着巨大的机遇和挑战。传统的快递服务管理方式已经无法满足日益增长的业务需求,快递服务流程中的问…

外包干了2年,快要废了。。。

先说一下自己的情况,普通本科毕业,在外包干了2年多的功能测试,这几年因为大环境不好,我整个人心惊胆战的,怕自己卷铺盖走人了,我感觉自己不能够在这样蹉跎下去了,长时间呆在一个舒适的环境真的会…

界面控件DevExpress WPF中文教程:Data Grid——卡片视图设置

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

使用Matlab神经网络工具箱

综述 在大数据和人工智能时代,深度学习是一种最为常见的数据分析和拟合工具。本报告以常用分析软件Matlab为例,介绍如何通过编写代码实现一个简单的CNN卷积神经网络。 Step 1: 打开matlab,新建脚本 1、安装matlab 2018以上版本后&#xff…

【系统设计——认证授权——基本概念知识】

1. 认证和授权的区别 Authentication(认证) 是验证您的身份的凭据(例如用户名/用户 ID 和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authenticat…

区块链技术入门:以太坊智能合约详解

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 区块链技术入门:以太坊智能合约详解 区块链技术入门:以太坊智能合约详解 区块链技术入门:以太…

【Spring】更加简单的将对象存入Spring中并使用

前言 本期讲解:通过Controller、Service、Repository、Component、Configurtion类注解、Bean方法注解,来更加简单的在Spring中存与读对象。 目录 1. 类注解 1.1 通过标签 1.2 使用类注解 1.3 什么是类注解 1.4 获取Bean对象命名问题 2. 方法注解 …

Vue(JavaScript)读取csv表格并求某一列之和(大浮点数处理: decimal.js)

文章目录 想要读这个表格,并且求第二列所有价格的和方法一:通过添加文件输入元素上传csv完整(正确)代码之前的错误部分因为价格是小数,所以下面的代码出错。如果把parseFloat改成parseInt,那么求和没有意义…

火山引擎云服务docker 安装

安装 Docker 登录云服务器。 执行以下命令,添加 yum 源。 yum update -y yum install epel-release -y yum clean all yum list依次执行以下命令,添加Docker CE镜像源。更多操作请参考Docker CE镜像。 # 安装必要的一些系统工具 sudo yum install -y yu…

人保财险(外包)面试分享

前言: 这是本月面的第三家公司,太难了兄弟们,外包都不好找了,临近年底,金九银十已经错过了,金三银四虽然存在,但按照这几年的行情,金九银十和金三银四其实已经是不复存在了&#xf…