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

news2024/11/18 11:20:43

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

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

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

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

安装

要求 python3.6版本及以上

pip install fastapi
pip install uvicorn

教程

第一步

from fastapi import FastAPI

app = 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 FastAPI

app = 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 FastAPI

class 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 FastAPI

app = 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 FastAPI

app = 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: str
    description: str = None
    price: float
    tax: float = None


app = 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 json

body = {
      "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, Query

app = FastAPI()

@app.get("/items/")
async def read_items(q: str = Query(None, min_length=3,max_length=50)): # q的最大长度为50,最小长度为3
    results = {"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, Query

app = 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, Query

app = 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 # centos

apt-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.coloradmin.cn/o/1276334.html

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

相关文章

瑜伽学习零基础入门,各种瑜伽教学方法全集

一、教程描述 练习瑜伽的好处多多,能够保证平衡健康的身体基础,提升气质、塑造形体、陶冶情操,等等。本套教程是瑜伽的组合教程,共由33套视频教程组合而成,包含了塑身纤体,速效瘦身,四季养生&a…

csp 现值计算 C语言

号: 202212-1 试题名称: 现值计算 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 问题描述 评估一个长期项目的投资收益,资金的时间价值是一个必须要考虑到的因素。简单来说,假设…

010 数据结构_红黑树

前言 本文将会向你介绍红黑树的概念、性质,以及如何手撕红黑树 1 文章重点 文本首先引入红黑树的概念和性质,性质非常重要对于后面的插入操作来说,文章的核心放在了插入部分,另外看插入部分之前记得看声名和节点的定义哦~ 2 引…

HarmonyOs 4 (二) HelloWord

目录 一 开发工具下载安装1.1 下载安装包1.2 下载相关依赖 二 开发者注册与个人实名认证三 第一个程序2.1 创建第一个程序2.2 认识开发者界面2.3 目录结构认识2.3.1 父目录认识2.3.2 AppScope 目录2.3.3 entry目录2.3.3.1 ets 目录2.3.3.2 resources目录 2.3.4 认识配置文件2.3…

leetCode 90.子集 II + 回溯算法 + 图解 + 笔记

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列 示例 1: 输入:nums [1,2,2] 输出…

k8s报错

报错: 这个错误信息表明你的容器运行时(container runtime)没有正常运行,具体是因为CRI(容器运行时接口)v1版本的API没有为特定的端点实现。这通常发生在使用containerd作为容器运行时时。错误信息中提到的…

Java集合(二)

1. Map 1.1 HashMap 和 Hashtable 的区别 线程是否安全: HashMap 是非线程安全的,Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!&…

生物教师个人简历(精选21篇)

以下21篇简历内容以生物教师招聘需求为背景制作,大家可以灵活借鉴,希望能帮助大家在众多候选人中脱颖而出。 生物教师个人简历下载(在线制作):百度幻主简历或huanzhuv.com 生物老师简历1: 求职意向 求职…

手机文件怎么传到电脑?简单方法分享!

将手机文件传输到电脑可以将其备份,以防数据丢失或意外情况发生。并且电脑具有更强大的处理能力,可以将文件进行编辑、修改、转换等操作,大大提高了工作效率。那么,手机文件怎么传到电脑?本文将为大家提供简单易懂的解…

nodejs微信小程序+python+PHP学科建设管理信息系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

【二分查找】LeetCode1970:你能穿过矩阵的最后一天

本文涉及的基础知识点 二分查找算法合集 作者推荐 动态规划LeetCode2552:优化了6版的1324模式 题目 给你一个下标从 1 开始的二进制矩阵,其中 0 表示陆地,1 表示水域。同时给你 row 和 col 分别表示矩阵中行和列的数目。 一开始在第 0 …

Python基础学习快速入门

文章目录 Number变量String字符串Def函数Class类List列表Tuple元组Dictionary字典Set集合值与引用类型if条件控制Loop循环 Number变量 python直接赋值,不需要定义变量类型。不需要**,逗号结尾符 使用print**直接进行输出 #赋值 a 1.0 print(a)a 7 print(a)p…

C语言错误处理之 “<errno.h>与<error.h>”

目录 前言 错误号处理方式 errno.h头文件 error.h头文件 参数解释: 关于的”__attribute__“解释: 关于“属性”的解释: 实例一: 实例二: error.h与errno.h的区别 补充内容: 前言 在开始学习…

[论文精读]利用大语言模型对扩散模型进行自我修正

本博客是一篇最新论文的精读,论文为UC伯克利大学相关研究者新近(2023.11.27)在arxiv上上传的《Self-correcting LLM-controlled Diffusion Models》 。 内容提要: 现有的基于扩散的文本到图像生成模型在生成与复杂提示精确对齐的图像时仍然存在困难,尤其是需要数值和…

目标检测——Fast R-CNN算法解读

论文:Fast R-CNN 作者:Ross Girshick 链接:https://arxiv.org/abs/1504.08083 代码:https://github.com/rbgirshick/fast-rcnn 目录 1、算法概述2、Fast R-CNN细节2.1The RoI pooling layer2.2 Fine-tuning for detection2.3 Fast…

【Android知识笔记】架构专题(三)

如何用工程手段,提高写代码的生产力?(元编程) 即如何写同样多的代码,花费更少的时间?如何自动生成代码,哪种代码可以被自动生成?哪些环节能够作为自动生成代码的切入点? 代码自动生成技术 代码自动生成,指的并不是让计算机凭自己的意愿生成代码。而是让预先实现好…

class-dump 混淆加固、保护与优化原理

​ 进行逆向时,经常需要dump可执行文件的头文件,用以确定类信息和方法信息,为hook相关方法提供更加详细的数据.class-dump的主要用于检查存储在Mach O文件的Objective-C中的运行时信息,为类,类别和协议生成声明信息&am…

熬夜会秃头——beta冲刺Day3

这个作业属于哪个课程2301-计算机学院-软件工程社区-CSDN社区云这个作业要求在哪里团队作业—beta冲刺事后诸葛亮-CSDN社区这个作业的目标记录beta冲刺Day3团队名称熬夜会秃头团队置顶集合随笔链接熬夜会秃头——Beta冲刺置顶随笔-CSDN社区 目录 一、团队成员会议总结 1、成员…

shareMouse 使用中遇到的问题

一、shareMouse 使用中遇到的问题 1、鼠标不能移动到另一个显示器 明明是两个显示器,但是 只显示一个,鼠标也不能移到另一个显示器上 后来, 设置了 wrap mouse pointer around display就好了,虽然还是显示一个显示器&#xff0c…

012 OpenCV sobel边缘检测

目录 一、环境 二、soble原理介绍 三、源码实验 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、soble原理介绍 Sobel边缘检测是一种广泛应用于图像处理领域的边缘检测算法,它通过计算图像灰度函数在水平方向和垂直…