Python FastAPI入门安装使用

2025-03-13 12:50

本文主要是介绍Python FastAPI入门安装使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《PythonFastAPI入门安装使用》FastAPI是一个现代、快速的PythonWeb框架,用于构建API,它基于Python3.6+的类型提示特性,使得代码更加简洁且易于绶护,这篇文章主要介...

Python FastAPI入门安装使用

第一节:FastAPI入门

一、FastAPI框架介绍

FastAPI是一个现代、快速的Python Web框架,用于构建API。它基于Python 3.6+的类型提示特性,使得代码更加简洁且易于绶护。

关键特性:

快速:可与 Nodejs 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。

高效编码:提高功能开发速度约 200% 至 300%。

更少 bug:减少约 40% 的人为(开发者)导致错误。
智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
简单:设计的易于使用和学习,阅读文档的时间更短。
简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
健壮:生产可用级别的代码。还有自动生成的交互式文档。
标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。

FastAPI 站在巨人的肩膀上:

  • Starlette 用于构建 Web 部件:Starl编程ette 是一个轻量级的 ASGI 框架和工具包,特别适合用来构建高性能的 asyncio 服务.
  • Pydantic 用于数据的操作:python 中用于数据接口定义检查与设置管理的库。

什么是ASGI服务(WSGI)

WSGI,(WEB SERVER GATEWAY INTERFACE),Web服务器网关接口,是一种Web服务器网关接口,它是一个Web服务器(如Nginx,uWSGI等服务器)与Web应用(如Flask框架写的程序)通信的一种规范。当前运行在WSGI协议之上的Web框架有Bottle,Flask,Django

ASGI:异步网关协议接口( Asynchronous Server Gateway Interface ) ,一个介于网络协议服务和Python应用之间的标准接口,能够处理多种通用的协议类型,包括HTTP,HTTP2和WebSocket。

WSGI和ASGI的区别

WSGI是基于HTTP协议模式的,不支持WebSocket,而ASGI的诞生则是为了解决Python常用的WSGI不支持当前Web开发中的一些新的协议标准。同时,ASGI对于WSGI原有的模式的支持和WebSocket的扩展,即ASGI是WSGI的扩展。

1、补充Web开发

Web应用开发主要是建立在B/S架构模式下,衍生出来的一系列web应用程序,即主要是基于浏览器的应用程序开发,这也是web应用程序开发的基础,比如淘宝、京东、当当网等。Web开发在近年来,随着本身技术的突破以及移动设备的普及,基于web领域的开发,也出现了明确的岗位职责分工,一个web互联网产品中,基本上会分为web UI设计、Web前端开发以及web后端开发。

1)Web前端开发

Web前端开发用到的编程语言主要有Javascript,以及伴随有标记性文本语言html和样式渲染方式css。以及近年来衍生出来的一批优秀web前端框架,使web前端在应用构建方面的效率得到显著提升。另外nodeJs的出现,越来越多的web前端开发人员开始走入服务端编程领域,甚至在一些项目中扮演着web全栈开发的角色。

2)Web后端开发

Web后端开发,主要用到的语言有python、php、java等,当然随着nodeJs的兴起,也成为近年来服务端开发的另一种选择。

Web应用程序开发是基于浏览器的,浏览器本身已经解决了多平台性兼容的问题,所以web开发一般是无需考虑跨平台所面临的兼容性问题。但是,web开发领域需要解决的有另一类问题,那便是多端兼容以及融合的问题,虽然web是基于浏览器的,没有跨平台的问题,但多端的快速发展,是web开发领域的新问题,即PC端、移动端以及当下比较火热的各类小程序端。

二、FastAPI安装

1、安装Python虚拟环境

为什么要使用虚拟环境

  • 项目部署时,直接导出项目对应的环境中的库就可以了;
  • 同时开发多个项目,各自项目使用的python版本不同,譬如一个是python2,另一个是python3,那么需要来回的切换python版本;
  • 当你同时开发多个项目时,特别是多个项目使用同一个库,譬如:django,但是各自项目使用的django的版本不一致时,那么你在开发这些项目时,需要来回的卸载和安装不同的版本,因为同一个python环境中,同名的库只能有一个版本。

虚拟环境的安装步骤

安装好python环境

安装虚拟环境库,在cmd中输入:

pip install virtphpualenv 

创建虚拟环境,在cmd中切换到需要创建虚拟环境的目录下,执行:

virtualenv env_name 

激活虚拟环境,在cmd中进入到 第三步创建的 env_name/Scripts 目录下,执行:

activate

执行成功后,在cmd中,当前输入行前面会有 (env_name) 的前缀

在当前状态下,使用 pip 就是在虚拟环境中安装第三方库了

退出虚拟环境,cmd中输入:

deactivate

2、安装FastAPI

需要安装所有的可选依赖及对应功能,包括了 uvicorn,你可以将其用作运行代码的服务器。

pip install fastapi[all] -i https://pypi.douban.com/simple/

你也可以分开来安装。

假如你想将应用程序部署到生产环境,你可能要执行以下操作:

pip install fastapi

并且安装 uvicorn来作为服务器:

pip install "uvicorn[standard]"

三、第一个FastAPI案例

创建一个main.py

from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
    return 'hello'
@app.get("/hello/{name}")
def say_hello(name: str):
    return {"message": f"Hello {name}"}
# 可以不要
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)

1、访问接口和文档

2、接口文档半天打不开的解决

这个接口文档调用了一个 js脚本,这个脚本是部署在国外的,总之 就是因为这个原因导致我们没法访问了,由此我们需要把这个脚本从网上下载下来,放到本地,把此处调用国外的脚本变成调用我们自己本地的,即可。

1)下载这些国外服务器的资源到一个static目录中

2)复制到项目中

3)修改fastapi的源代码

4) 在app中注册static目录

5)打开接口文档

3、总结

1)uvicorn命令说明:

uvicorn main:app 命令含义如下:

  • mainmain.py 文件(一个 Python「模块」)。
  • app:在 main.py 文件中通过 app = FastAPI() 创建的对象。
  • --reload:让服务器在更新代码后重新启动。仅在开发时使用该选项。

2)app变量

编程

这里的变量 app 会是 FastAPI 类的一个实例 变量名字。这个实例将是创建你所有 API 的主要交互对象。

也可以修改app变量名字:

from fastapi import FastAPI
my_awesome_api = FastAPI()
@my_awesome_api.get("/")
def root():
    return {"message": "Hello World"}

3)请求路径(路由)

请求路径指的是 URL 中从第一个 / 起的后半部分。所以,在一个这样的 URL 中:

http://example.com/items/foo
http://127.0.0.1/items/foo

那么,真正的请求路径(路由)是:/items/foo

在FastAPI中,路由的配置是通过: 装饰器 完成的。

4)请求方法(操作)

在 HTTP 协议中,你可以使用以下的其中一种(或多种)请求方法 与每个路径进行通信。

通常使用:

  • POST:创建数据。
  • GET:读取数据。
  • PUT:更新数据。
  • DELETE:删除数据。
  • PATCH: 修改单一数据

配置请求方法:

  • @app.post()
  • @app.put()
  • @app.delete()
  • @app.get()

以及更少见的:

  • @app.options()
  • @app.head()
  • @app.patch()
  • @app.trace()

 5)路由+请求方法 +函数的映射

  • 路径 :是 /
  • 操作 :是 get
  • 函数 :是位于「装饰器」下方的函数(位于 @app.get("/") 下方)
@app.get("/")
def root():
    return {"message": "Hello World"}

6)返回响应

from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
    return {"message": "Hello World"}  # 返回响应

你还可以返回一个 dictlist,像 strint 一样的单个值,等等。你还可以返回 Pydantic 模型。还有许多其他将会自动转换为 JSON 的对象和模型(包括 ORM 对象等)。

四、路由参数

你可以使用与 Python 格式化字符串相同的语法来声明路径"参数"或"变量":

@app.get("/items/{item_id}")
def read_item(item_id):
    return {"item_id": item_id}

路径参数 item_id 的值将作为参数 item_id 传递给你的函数。所以,如果你运行示例并访问 http://127.0.0.1:8000/items/foo,将会看到如下响应:

{"item_id":"foo"}

1、定义参数的类型

你可以使用标准的 Python 类型标注为函数中的路径参数声明类型。

@app.get("/items/{item_id}")
def read_item(item_id: int):
    return {"item_id": item_id}

在这个例子中,item_id 被声明为 int 类型。FastAPI 通过上面的类型声明提供了对请求的自动"解析"。

同时还提供数据校验功能:

如果你通过浏览器访问 http://127.0.0.1:8000/items/foo,你会看到一个清晰可读的 HTTP 错误:

{
    "detail": [
        {
            "loc": [
                "path",
                "item_id"
            ],
            "msg": "value is not a valid inpythonteger",
            "type": "type_error.integer"
        }
    ]
}

因为路径参数 item_id 传入的值为 "foo",它不是一个 int

你可以使用同样的类型声明来声明 strfloatbool 以及许多其他的复合数据类型。

2、路由匹配的顺序

由于路由匹配操作是按顺序依次运行的,你需要确保路径 /users/me 声明在路径 /users/{user_id}之前:

@app.get("/users/me")
def read_user_me():
    return {"user_id": "the current user"}
@app.get("/users/{user_id}"编程)
def read_user(user_id: str):
    return {"user_id": user_id}

否则,/users/{user_id} 的路径还将与 /users/me 相匹配,"认为"自己正在接收一个值为 "me"user_id 参数。

3、预设值参数

如果你有一个接收路径参数的路径操作,但你希望预先设定可能的有效参数值,则可以使用标准的 Python Enum 类型。

Python中的枚举数据类型:是指列出有穷集合中的所有元素,即一一列举的意思。在Python中,枚举可以视为是一种数据类型,当一个变量的取值只有几种有限的情况时,我们可以将其声明为枚举类型。例如表示周几的这一变量weekday,只有七种可能的取值,我们就可以将其声明为枚举类型。

from enum import Enum
class Weekday(Enum):
    monday = 1
    tuesday = 2
    wednesday = 3
    thirsday = 4
    friday = 5
    saturday = 6
    sunday = 7
print(Weekday.wednesday)         # Weekday.wednesday  
print(type(Weekday.wednesday))   # <enum 'Weekday'>
print(Weekday.wednesday.name)    # wednesday
print(Weekday.wednesday.value)   # 3
from enum import Enum
from fastapi import FastAPI
class ModelName(str, Enum):
    alexnet = "alexnet"
    resnet = "resnet"
    lenet = "lenet"
app = FastAPI()
@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
    if model_name is ModelName.alexnet:
        return {"model_name": model_name, "message": "Deep Learning FTW!"}
    if model_name.value == "lenet":
        return {"model_name": model_name, "message": "LeCNN all the images"}
    return {"model_name": model_name, "message": "Have some residuals"}

到此这篇关于Python FastAPI入门安装使用的文章就介绍到这了,更多相关Python FastAPI入门内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Python FastAPI入门安装使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153728

相关文章

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

使用Python实现一个简易计算器的新手指南

《使用Python实现一个简易计算器的新手指南》计算器是编程入门的经典项目,它涵盖了变量、输入输出、条件判断等核心编程概念,通过这个小项目,可以快速掌握Python的基础语法,并为后续更复杂的项目打下... 目录准备工作基础概念解析分步实现计算器第一步:获取用户输入第二步:实现基本运算第三步:显示计算结果进

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Python利用PySpark和Kafka实现流处理引擎构建指南

《Python利用PySpark和Kafka实现流处理引擎构建指南》本文将深入解剖基于Python的实时处理黄金组合:Kafka(分布式消息队列)与PySpark(分布式计算引擎)的化学反应,并构建一... 目录引言:数据洪流时代的生存法则第一章 Kafka:数据世界的中央神经系统消息引擎核心设计哲学高吞吐

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N