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

原文: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.mfbz.cn/a/208309.html

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

相关文章

nc 传输目录

使用nc命令进行目录传输 接收方发送方 使用TCP连接进行文件传输,不提供数据加密或身份验证 接收方 -ip 192.168.1.200 nc -l -p 2222 | tar -xvf -发送方 发送目录 lotus tar -cf - lotus | nc 192.168.1.200 2222

Python+Requests对图片验证码的处理

Requests对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入,而且每次登录时图片验证码都是随机的;当通过request做接口登录的时候要对图片验证码进行识别出图片中的字段,然后再登录接口中使用; 通过request对图片验…

LINUX 嵌入式C编程--信号编程

基本概念 信号是事件发生时对进程的通知机制,也可以把它称为软件中断。信号与硬件中断的相似之处在于能够打断程序当前执行的正常流程,其实是在软件层次上对中断机制的一种模拟。信号提供了一种处理异步事件的方法。 信号目的 **信号的目的是用来通信…

shell编程系列(9)-使用cut选择列

文章目录 前言使用cut选择列选择特定的列 结语 前言 前面的文章介绍了sed命令,sed可以帮我们处理文本列,这边文章介绍cut命令,cut命令可以帮我们选择想要的列,在文本处理时候结合sed命令,就可以精准定位了。 cut命令是…

HuggingFace学习笔记--Model的使用

1--Model介绍 Transformer的 model 一般可以分为:编码器类型(自编码)、解码器类型(自回归)和编码器解码器类型(序列到序列); Model Head(任务头)是在base模型…

java正则表达式字母开头后面跟12位数字

字母开头后面跟12位数字 ^[A-Za-z]\d{12}$ 验证: 验证工具地址: Java正则表达式测试

学习感悟一己之言

学习感悟一己之言 学习上克服困难实际上是克服心理上或认识上的障碍的过程。所谓的理解,就是化陌生为熟悉。看不懂,一方面是因为接触的材料太陌生,即远离你当前的背景知识;另一方面是材料或讲述者的描述刻画不准确或晦涩不当。有了…

修改sublime配置让其显示文件编码格式

1、下载sublime并安装 2、点击菜单栏Preferences,然后在Preferences里面点击Setting 3、然后在跳出来的窗口添加: "show_enconding":true, 4、随便打开一个文件就可以在底部查看文件编码格式:

openbabel 安装 生成指纹方法

今日踩坑小结: openbabel 安装: 可以装,但是得在 Linux 环境下,win 环境装会报错(安装不会报错,但是生成指纹的时候会) 指纹: 在下面这个链接里,官方给出了命令行调用 o…

一篇博客带你认识泛型

目录 泛型类(Generic Class): 泛型方法(Generic Method): Java 中的泛型是一种编程机制,允许你编写可以与多种数据类型一起工作的代码,同时提供编译时类型检查以确保类型的安全性。泛型的主要目的是提高代…

外贸获客的几种正确打开方式,还不快来GET!

做外贸还在愁没客户?作为外贸人,开发客户是我们的重要工作内容,想要高效地开发客户,首先就要知道外贸获客的方法有哪些,当下最主流的外贸获客渠道分为线下和线上两种方式,今天东哥就介绍几种获客渠道&#…

YOLOv5项目实战(5)— 算法模型优化和服务器部署

前言:Hello大家好,我是小哥谈。近期,作者所负责项目中的算法模型检测存在很多误报情况,为了减少这种误报情况,作者一直在不断优化算法模型。鉴于此,本节课就给大家详细介绍一下实际工作场景中如何去优化算法模型和进行部署,另外为了方便大家进行模型训练,作者在文章中提…

流量内存cpu使用率使用工具

类似360工具球的工具 我提供了夸克下载喜欢的朋友可以直接下载使用 我用夸克网盘分享了「TrafficMonitor」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。 链接:https://pan…

wpf devexpress 使用IDataErrorInfo实现input验证

此处下载源码 当form初始化显示,Register按钮应该启动和没有输入错误应该显示。如果用户点击注册按钮在特定的输入无效数据,form将显示输入错误和禁用的注册按钮。实现逻辑在标准的IDataErrorInfo接口。请查阅IDataErrorInfo接口(System.Com…

微机原理——定时器学习1

目录 定时类型 8253内部结构框图 8253命令字 六种工作方式及输出波形 计数初值的计算与装入 8253的初始化 定时类型 可编程定时器8253:(内部采用的是16位 减法计数器) 8253内部结构框图 8253命令字 8253有三个命令字:方式命…

【广州华锐视点】VR云端看车:一键穿越!VR技术让你在家就能试驾各种豪车!

随着科技的不断发展,虚拟现实(VR)技术已经逐渐走进我们的生活。在汽车行业,VR线上看车已经成为了一种全新的购车体验。通过这种创新的方式,消费者可以在不出门的情况下,全方位地了解汽车的外观、内饰和性能…

PGSQL(PostgreSQL)数据库安装教程

安装包下载 下载地址 下载后点击exe安装包 设置的data存储路径 设置密码 设置端口 安装完毕,配置PGSQL的ip远程连接,pg_hba.conf,postgresql.conf,需要更改这两个文件 pg_hba.conf 最后增加一行 host all all …

1+x网络系统建设与运维(中级)-练习题

一.给设备重命名 同理可得&#xff0c;所有交换机和路由器都用一下命令配置 <Huawei>sys [Huawei]sysn LSW1 二.配置VLAN LSW1&#xff1a; [LSW1]vlan batch 10 20 [LSW1]int e0/0/1 [LSW1-Ethernet0/0/1]port link-type access [LSW1-Ethernet0/0/1]port default vlan…

P1012 [NOIP1998 提高组] 拼数( 字典序 )

字典序&#xff1a; 在字典中&#xff0c;单词是按照首字母在字母表中的顺序进行排列的 比如 alpha 在 beta 之前。 1.而第一个字母相同时&#xff0c;会 去比较两个单词的第二个字母在字母表中的顺序&#xff0c;比如 account 在 advanced 之前&#xff0c;以此类推。 2. 若…

2023年中国金融科技研究报告

第一章 行业概况 1.1 定义 金融科技&#xff08;FinTech, Financial Technology&#xff09;代表了金融和技术的交汇。这一领域虽然处于发展的初期阶段&#xff0c;但已经展现出深远的影响力。金融科技的业务模式多样&#xff0c;涵盖了从传统金融服务的数字化转型到新兴技术…
最新文章