python简单进阶之web框架:fastapi使用教程

原文:python简单进阶之web框架:fastapi使用教程 - 知乎

这是简单进阶教程系列第四篇,本系列文章主要介绍那些可以很快上手的进阶库。

我其实学过一段时间Django框架,但是半途而废了,我觉得可能还是简单一点的框架比较适合我吧……

官方教程:https://fastapi.tiangolo.com/

安装

要求 python3.6版本及以上

pip install fastapi
pip install uvicorn

教程

第一步

from fastapi import FastAPIapp = FastAPI() # 创建API实例@app.get("/")
async def root():return {"message": "Hello World"}

代码解释

@app.get("/")功能是定义路径操作,代表着访问example.com/时执行GET操作。

路径,即网址第一个斜杠到最后的部分,比如 https://example.com/items/foo的路径就是 /items/foo,通常也称为端点或 路由
操作,即GET,POST,PUT,DELETE等HTTP方法
在python中, @something被称为装饰,意味着采用下面的函数进行处理。

async def是定义异步函数的方法,你也可以定义为普通函数def

简单来说,如果你的程序不需要执行的先后顺序(比如先访问数据库,再返回字典),那么可以用异步,否则的话用普通的函数即可

return可以返回dict,list,str,int等等。

运行

将其复制到main.py,打开cmd,输入uvicorn main:app --reload,即可运行。

参数解释。  main:文件 main.pyappmain.py内创建的对象 app = FastAPI()--reload:更改代码后服务器重新启动,仅用于开发。

打开浏览器输入地址http://127.0.0.1:8000,即可看到成功返回

{"message": "Hello World"}

输入http://127.0.0.1:8000/docs,即可看到交互式文档;输入http://127.0.0.1:8000/redoc即可看到API文档。

路径参数

传递参数

from fastapi import FastAPIapp = FastAPI()@app.get("/items/{item_id}")
async def read_item(item_id):return {"item_id": item_id}

使用大括号将输入的参数括起来,即可将同名参数传递给下面的函数。

输入http://127.0.0.1:8000/items/foo,返回{"item_id":"foo"}

参数类型

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

使用def func(para:type)的格式定义参数数据类型。

这样也有将输入参数自动进行类型转换的效果,比如http://127.0.0.1:8000/items/3,那么返回的就是个int而不是str。当然如果无法转换也会有友好的错误提示。

比如输入http://127.0.0.1:8000/items/foolhttp://127.0.0.1:8000/items/3.2都会返回错误

创建枚举类

from enum import Enum
from fastapi import FastAPIclass ModelName(str, Enum):alexnet = "alexnet"resnet = "resnet"lenet = "lenet"app = FastAPI()@app.get("/model/{model_name}")
async def get_model(model_name: ModelName):if model_name == 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"}

如果有好几个预定义参数有相同的数据类型,那么可以使用enum模块,并通过类名.参数名调用。

PS:alexnet、resnet、lenet都是机器学习术语,可以换成任何参数。

它最大的好处就是可以在文档中显示可用参数

查询参数

声明不属于路径参数的其他功能参数时,它们将自动被解释为“查询”参数。

from fastapi import FastAPIapp = FastAPI()fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):return fake_items_db[skip : skip + limit]

在HTTP路径中,查询参数表现为URL中位于?之后,以&字符分隔的键值对。

比如http://127.0.0.1:8000/items/?skip=0&limit=1skip为0,limit为1

返回[{"item_name":"Foo"},{"item_name":"Bar"}]

默认值

上面例子中skip: int = 0即设定skip参数默认为0,那么我们访问http://127.0.0.1:8000/items/,等同于http://127.0.0.1:8000/items/?skip=0&limit=10

可选参数

把默认值设为None即可,如q: str = None

多路径和查询参数组合

from fastapi import FastAPIapp = FastAPI()@app.get("/users/{user_id}/items/{item_id}")
async def read_user_item(user_id: int, item_id: str, q: str = None, short: bool = False
):item = {"item_id": item_id, "owner_id": user_id}if q:item.update({"q": q})if not short:item.update({"description": "This is an amazing item that has a long description"})return item

请求体

注:要使用请求体,就不能使用GET操作,而用POST(较常见), PUTDELETEPATCH

from fastapi import FastAPI
from pydantic import BaseModel# 将数据模型定义为继承BaseModel的类
class Item(BaseModel):name: strdescription: str = Noneprice: floattax: float = Noneapp = FastAPI()@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: str = None):result = {"item_id": item_id, **item.dict()}if q:result.update({"q": q})return result

看起来有丶复杂,不过我们用python请求一下就知道怎么回事了。

import requests
import jsonbody = {"name": "yanshu","description": "yanshu's blog","price": 100,"tax": 0}body = json.dumps(body) # 需要先解析response = requests.put('http://127.0.0.1:8000/items/3',data = body)
print(response.text)

返回

{"item_id":3,"name":"yanshu","description":"yanshu's blog","price":100.0,"tax":0.0}

字符串验证

本节讲一下如何限定输入字符串的格式,比如最大输入字符数,必须含有XXX等等。

from fastapi import FastAPI, Queryapp = FastAPI()@app.get("/items/")
async def read_items(q: str = Query(None, min_length=3,max_length=50)): # q的最大长度为50,最小长度为3results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}if q:results.update({"q": q})return results

正则表达式如q: str = Query(None, min_length=3, max_length=50, regex="^fixedquery$")

上述例子都是为q添加了一个默认参数None,也就是让它变成了可选参数,那我如何把它变成必须参数呢?很简单:

def read_items(q: str = Query(..., min_length=3)):

查询多个参数值

from typing import List
from fastapi import FastAPI, Queryapp = FastAPI()@app.get("/items/")
async def read_items(q: List[str] = Query(None)):query_items = {"q": q}return query_items

这样http://localhost:8000/items/?q=foo&q=bar就会同时查询q为foo和bar的情况。

当然,也可以指定默认值

async def read_items(q: List[str] = Query(["foo", "bar"])):

别名参数

from fastapi import FastAPI, Queryapp = FastAPI()@app.get("/items/")
async def read_items(q: str = Query(None, alias="item-query")):results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}if q:results.update({"q": q})return results

这样,你就可以http://127.0.0.1:8000/items/?item-query=foobaritems

已弃用参数

deprecated=True,这样这个参数仍然能用,但是文档中就会显示这个参数已经不再维护。

部署

直接使用

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

即可

注意main后面直接:app

如何持续后台运行?

安装screen

yum install screen # centosapt-get update -y #Debian
apt-get install screen -y

使用:

screen -S name # 创建一个名为name的screen窗口
screen -ls # 查看所有窗口
screen -r name # 返回名为name的窗口
exit # 退出当前窗口
虽然官方推荐gunicorn,但是我用的时候直接报 Internal Server Error错误,没办法只能曲线救国了

想使用自己的域名?

很简单,用宝塔反向代理即可,如果想要加SSL的话,就不能使用文件验证,而要用DNS验证。

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

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

相关文章

智能优化算法应用:基于象群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于象群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于象群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.象群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

网络类型解析(基础):探索通信世界的多样面貌

在当今数字化时代,网络已经成为人们生活和工作中不可或缺的一部分。从个人设备之间的直接通信到全球范围的数据传输,不同类型的网络为我们提供了多种连接方式和通信选择。透过对这些网络类型的解析,我们将更好地理解它们的特点、优势和适用场…

JMX的使用

1. 定义和意义 JMX是Java Management Extention的缩写,出发点是让外部通过属性/方法来读取或设置程序状态。对于提供对外服务的程序来说,天生就有这样的能力,Web程序通过HTTP接口对外暴露,RPC应用通过RPC接口暴露。不过带来的问…

ESP32-Web-Server编程- 使用表格(Table)实时显示设备信息

ESP32-Web-Server编程- 使用表格(Table)实时显示设备信息 概述 上节讲述了通过 Server-Sent Events(以下简称 SSE) 实现在网页实时更新 ESP32 Web 服务器的传感器数据。 本节书接上会,继续使用 SSE 机制在网页实时显…

深度学习手势识别 - yolo python opencv cnn 机器视觉 计算机竞赛

文章目录 0 前言1 课题背景2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存 5 模型训练5.1 修…

C++模板—函数模板、类模板

目录 一、函数模板 1、概念 2、格式 3、实例化 4、模板参数的匹配 二、类模板 1、定义格式 2、实例化 交换两个变量的值,针对不同类型,我们可以使用函数重载实现。 void Swap(double& left, double& right) {double tmp left;left ri…

黑马一站制造数仓实战1

1. 项目目标 一站制造 企业中项目开发的落地:代码开发 代码开发:SQL【DSL SQL】 SparkCore SparkSQL 数仓的一些实际应用:分层体系、建模实现 2. 内容目标 项目业务介绍:背景、需求 项目技术架构:选型、架构 项目环境…

SpringBootWeb案例_03

Web后端开发_06 SpringBootWeb案例_03 登录认证 智能学习辅助系统登录时需要身份验证 1.登录功能 先实现简单的登录功能,在进一步优化。 1.1需求 若账户或密码不存在/密码不正确,则登录失败。 账户密码正确,则登录成功 1.2接口文档 …

git基本概念

一、版本控制概念 1.1 什么是版本控制 1.1.1 手动管理文件版本 1.1.2 版本控制软件 概念:版本控制软件是一个用来记录文件发生的变化,以便将来查阅特定版本修订情况的系统,有时也叫“版本控制系统”。通俗的理解就是把手工管理文件版本的方…

关于电脑提示vcruntime140_1.dll无法继续执行代码的解决办法

vcruntime140_1.dll是Visual C运行时库的一个组成部分,它包含了大量用于支持C应用程序运行时的功能。这个文件通常在开发和使用C程序时被调用,特别是在使用Microsoft Visual Studio进行开发时。vcruntime140_1.dll文件丢失或损坏会导致C程序无法正常运行…

信息化,数字化,智能化是3种不同概念吗?与机械化,自动化矛盾吗?

先说结论: 1、信息化、数字化、智能化确实是3种不同的概念! 2、这3种概念与机械化、自动化并不矛盾,它们是制造业中不同发展阶段和不同层次的概念。 机械化:是指在生产过程中使用机械技术来辅助人工完成一些重复性、单一性、劳…

助力android面试2024【面试题合集】

转眼间,2023年快过完了。今年作为口罩开放的第一年大家的日子都过的十分艰难,那么想必找工作也不好找,在我们android开发这一行业非常的卷,在各行各业中尤为突出。android虽然不好过,但不能不吃饭吧。卷归卷但是还得干…

Pytorch——多卡GPU训练与单卡GPU训练相互切换

部分深度学习网络默认是多卡并行训练的,由于某些原因,有时需要指定在某单卡上训练,最近遇到一个,这里总结如下。 目录 一、多卡训练1.1 修改配置文件1.2 修改主训练文件1.3 显卡使用情况 二、单卡训练2.1 修改配置文件2.2 显卡使…

简单了解下IP的全球划分【笔记】

国际互联网号码分配机构 (The Internet Assigned Numbers Authority,简称IANA)。它是互联网名称与数字地址分配机构(The Internet Corporation for Assigned Names and Numbers,简称ICANN)旗下的一个机构,主…

Linux5-计划任务、进程

计划任务 一、cron 计划任务 周期性计划任务 cron 任务概述 • 用途:按照设置的时间间隔为用户反复执行某一项固定的系统任务 • 软件包:cronie、crontabs • 系统服务:crond • 日志文件:/var/log/crond 管理计划任务策略 • 使用 cro…

存储虚拟化的写入过程

存储虚拟化的场景下,整个写入的过程。 在虚拟机里面,应用层调用 write 系统调用写入文件。write 系统调用进入虚拟机里面的内核,经过 VFS,通用块设备层,I/O 调度层,到达块设备驱动。虚拟机里面的块设备驱动…

uniapp uni-popup组件在微信小程序中滚动穿透问题

起因 在微信小程序中使用uni-popup组件时&#xff0c;出现滚动穿透&#xff0c;并且uni-popup内部内容不会滚动问题。 解决 滚动穿透 查阅官方文档&#xff0c;发现滚动穿透是由于平台差异性造成的&#xff0c;具体解决可以参照文档禁止滚动穿透 <template><page-…

【概率统计】如何理解概率密度函数及核密度估计

文章目录 概念回顾浅析概率密度函数概率值为0&#xff1f;PDF值大于1&#xff1f;一个栗子 核密度估计如何理解核密度估计核密度估计的应用 总结 概念回顾 直方图&#xff08;Histogram&#xff09;&#xff1a;直方图是最直观的一种方法&#xff0c;它通过把数据划分为若干个区…

软件工程 - 第8章 面向对象建模 - 2 静态建模

静态建模&#xff08;类和对象建模&#xff09; 类和对象模型的基本模型元素有类、对象以及它们之间的关系。系统中的类和对象模型描述了系统的静态结构&#xff0c;在UML中用类图和对象图来表示。 类图由系统中使用的类以及它们之间的关系组成。类之间的关系有关联、依赖、泛…

Numpy进阶

NumPy进阶80题完整版