FastAPI入门

fastapi教程(一):初识 fastapi FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 并基于标准的 Python 类型提示。 阅读详情
AI摘要

本文介绍了FastAPI框架,它是用于构建API的现代、快速的web框架,具有高性能、高效编码等特性。文中详细讲解了FastAPI的安装、运行服务器、使用交互式Api文档等操作,还涉及何时使用不同参数、定制返回信息、关联数据库等内容,以及请求体、校验、响应模型等方面的知识。

FastAPI 框架,高性能,易于学习,高效编码,生产可用
官方文档: https://fastapi.tiangolo.com
FastAPI 是一个用于构建 API 的现convert_underscores代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。
关键特性:

  • 快速:可与 NodeJS 和 Go 比肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。
  • 高效编码:提高功能开发速度约 200% 至 300%。
  • 更少 bug:减少约 40% 的人为(开发者)导致错误。
  • 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
  • 简单:设计的易于使用和学习,阅读文档的时间更短。
  • 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
  • 健壮:生产可用级别的代码。还有自动生成的交互式文档。
  • 标准化:基于(并完全兼容)API 的相关开放标准。

安装FastApi:

pip3 install fastapi
pip3 install unicorn

开始第一个Demo

# 创建一个main.py文件

from typing import Optional

from fastapi import FastAPI

app = FastAPI()


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


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

运行服务器:

一、命令运行服务器:

uvicorn main:app --reload --port 8888 # 更改端口号

二、代码运行服务器调试:

if __name__ == '__main__':
    import uvicorn

    uvicorn.run("main:app", reload=True, port=5555)

FastApi提供交互式Api文档一:这很方便我们管理自己的接口

现在访问 http://localhost:8000/docs 就会生成一个Swagger文档

FastApi提供交互式Api文档二:这很方便我们管理自己的接口

现在访问 http://127.0.0.1:8000/redoc 就会生成一个redoc文档
 

FastApi中何时用Path、Query、Header、Body

Query:查询参数用
Path:路径参数
Body:需要在请求数据传入countent_type为json的
Form:请求数据为表单的

如果你想即「get」又「post」同时请求,你可以这么做:

@app.api_route("/login", methods=("GET", "POST", "PUT"))
def login():
    """这是一个登陆接口"""
    return {"msg": "login success", "code": 200}

何时用「Form」,何时用「Body」,何时用「Header」呢

如果你你以表单的形式传递数据,那你就应该用「Form」,看一下代码

@app.post("/login1")
def login_form(username=Form(None), password=Form(None)):
    return {"username": username, "password": password}


如果你以JSON的形式传递数据,那你就应该用「Body」,看一下代码

@app.post("/login")
def login(data=Body(None)):
    return {"data": data}


如果你你想传递「Header」数据,那你就应该用「Header」,看一下代码

@app.get("/user")
def user(id, num=Header(None)):
    return {"id": id, "num": num}

如何定制一个返回信息,看代码

作用:就是将自己定义好的响应结果返回回来

from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()


@app.get("/user")
def user():
    return JSONResponse(content={"msg": "get user"},   # 内容
                        status_code=202,  # 状态码,默认为200
                        headers={"a": "b"})


if __name__ == '__main__':
    import uvicorn

    uvicorn.run("04_response:app", reload=True)

如何将自己写的html网站动态加载到fastapi(jinja2模板返回Html页面)

我们需要安装一些依赖库

1、jinja2
pip install jinjia2
2、aiofiles
pip install aiofiles

废话不多说,看代码

from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates   # 需要进入的库
from starlette.staticfiles import StaticFiles  # 引入静态文件库


app = FastAPI()
# 指定静态文件存放路径
app.mount("/page", StaticFiles(directory="page"), name="page")
# 指定html 存放目录
template = Jinja2Templates("page")


@app.get("/home")
def home (req: Request):
    return template.TemplateResponse("index.html", context={"request": req})


if __name__ == '__main__':
    import uvicorn

    uvicorn.run("d05_templates:app", reload=True)


如果你的代码中有引入到css样式,你就可以向我这样,你会发现样式就被引入进来了

如果你想自定义传参进来,你可以试试这样:

如果你想实现这样的例子

# main.py

from fastapi import FastAPI, Request, Form
from fastapi.responses import RedirectResponse
from fastapi.templating import Jinja2Templates

app = FastAPI()
template = Jinja2Templates("pages")
todos = ["写博客", "看电影", "玩游戏"]


@app.get("/")
async def index(req: Request):
    return template.TemplateResponse("index.html", context={"request": req, "todos": todos})


@app.post("/todo")
async def todo(todo=Form(None)):
    """处理用户发送过来的 todolist 数据"""
    todos.insert(0, todo)
    return RedirectResponse('/', status_code=302)


if __name__ == '__main__':
    import uvicorn

    uvicorn.run("main:app", reload=True)


在这里我说一下为什么要将状态码设置为302,如果你不设置这个status_code,浏览器发送给后端的请求状态码为307,因为307的状态码是不能从post请求跳转到get请求,原因是post请求如果要跳转到get请求不通用,如果想进行跳转,需要将307更改为302。

# index.html    <meta charset="UTF-8">    <title>Title</title><h1>待办事项</h1><div>    <form action="/todo" method="post">        <input name="todo" type="text" placeholder="请添加待办事件...">        <input type="submit" value="添加">    </form></div>    {% for todo in todos %}    <p>{
  
  { todo }}</p>    {% endfor %}

关联数据库,将数据存储化

第一步:我们需要安装依赖库

pip install tortoise-orm
pip install aiomysq

第二步:电脑需要安装mysql,安装调试过程不在赘述

以我为例:先创建一个db为fastapi的库

create database fastapi;

第三步:配置数据库

from tortoise.contrib.fastapi import register_tortoise

# 数据库绑定
register_tortoise(app,
                  db_url="mysql://root:Ranyong_520@localhost:3306/fastapi",
                  modules={"models": []},
                  add_exception_handlers=True,
                  generate_schemas=True)

实例一:将数据存储到数据库并返回给前端

# d06_templates.py
from fastapi import FastAPI, Request, Form
from fastapi.responses import RedirectResponse
from fastapi.templating import Jinja2Templates
from tortoise.contrib.fastapi import register_tortoise

from dao.models import Todo

app = FastAPI()
template = Jinja2Templates("pages")

# 数据库绑定
register_tortoise(app,
                  db_url="mysql://root:Ranyong_520@localhost:3306/fastapi",
                  modules={"models": ['dao.models']},  # 设置模型类
                  add_exception_handlers=True,
                  generate_schemas=True)


@app.get("/")
async def index(req: Request):
    # 从数据库获取 todos 的代码
    # ORM,获取所有的 todos
    todos = await Todo.all()  # 获取所有的todos
    print(todos)
    return template.TemplateResponse("index.html", context={"request": req, "todos": todos})


@app.post("/todo")
async def todo(content=Form(None)):
    """处理用户发送过来的 todolist 数据"""
    await Todo(content=content).save()
    return RedirectResponse('/', status_code=302)


if __name__ == '__main__':
    import uvicorn

    uvicorn.run("d06_templates:app", reload=True)


然后创建一个dao的文件夹里面创建一个models的py文件

from tortoise import Model, fieldsclass Todo(Model):    """数据库当中的表 todo"""    id = fields.IntField(pk=True)  # id为int类型的 pk:是将id作为主键    content = fields.CharField(max_length=500)  # todo项里面的内容    例如:todos = ["写博客", "看电影", "玩游戏"]    created_at = fields.DatetimeField(auto_now_add=True)  # auto_now_add 当每次插入新数据的时候会引用本地时间    updated_at = fields.DatetimeField(auto_now=True)  # auto_now 当每次修改数据后会更新本地时间


这时候我们来运行下代码:
 


可以发现返回了,并没有返回添加的数据,那我们再去数据库看,点击数据库更新按钮后,可以发现我们的数据已经存储到了表中表。
 


 


可以看到数据库已经存了我们提交的数据,现在我们只需要改一下index.html文件一个地方就可以解决
 


最后效果

枚举(Enum)

在python3.4以后才可使用

第一步:需要倒入Enum库

from enum import Enum

第二步:创建一个Enum的子类

class ModelName(str, Enum):
    A = 'a'
    B = 'b'
    C = 'c'
# 预设值.py
from fastapi import FastAPI                                          
                                                                     
from enum import Enum                                                
                                                                     
                                                                     
# 预设值                                                                
# 如果你有一个接收路径参数的路径操作,但是你希望预先设定可能的有效参数值                                
                                                                     
# 创建一个继承str和Enum的子类                                                  
class ModelName(str, Enum):                                          
    A = 'a'                                                          
    B = 'b'                                                          
    C = 'c'                                                          
                                                                     
                                                                     
app = FastAPI()                                                      
                                                                     
                                                                     
@app.get("/models/{model_name}")                                     
async def get_model(model_name: ModelName):                          
    if model_name
如何评价最近爆红的FastAPI? 一度觉得sanic是pythonweb框架的未来,支持异步,性能好,类flask的语法,代码简单,没想到被fastapi截胡了,fastapi在github的上星速度非常快。它在怎么样把后端api做好的这件事情上,做的比sanic更全面,更彻底。是用于构建WebAPI的现代、开源、快速、高性能的Web框架,它基于Python3.6+标准类型提示,支持异步,正如它的名字,FastAPI就是为构建快速的API而生。... 阅读详情

相关推荐

FastAPI Web框架教程 第1章 快速上手

FastAPI 是一个。

此博客内容主要是小可日常工作中的一些问题解决的记录整理而成 3504

超全面整理fastAPI(从入门到运用),进来看十秒钟再走不迟

【写在前面】:大家好,我是【猪葛】 一个很看好AI前景的算法工程师 我自己会给公司开发很多人工智能的算法功能,但是因为后端人员很忙, 所以我自己得把功能封装成接口部署到服务器, 所以自己就自学FastAPI框架 这个框架非常适合新手入门后端的接口开发 我自己也就学了不到一个星期,现在将学习过程的笔记分享出来 希望能给大家一点帮助,如果你也喜欢我的博客,欢迎关注我的动态,一起学习一起进步 入门从第一章到第四章即可 提升从第五章到第七章 进阶从第八章往后,以后会进一步更新更高级用法 本篇博客学习目标:1.

my_name_is_learn的博客 6万+

FastAPI 快速入门

👑 FastAPI 学习记录 文章目录👑 FastAPI 学习记录😉前言一、👻FastApi??1.😎FastAPI可以做什么2.🚲为什么要学习 FastAPI二、安装FastAPI1.✨编译器工具2.🎫python安装教程3.🎟pycharm安装教程 😉前言 提示: 文章为个人学习心得 如有冒犯 call me! 🛴快点做!!!!** 一、👻FastApi?? 😀----😃----连----😃----接----😄----线----😆 1.😎FastAPI可以做什么 🍳由Sebastian Rami

weixin_53906838的博客 1万+

FastApi-快速入门FastApi框架(1)

本文是该专栏的第1篇,后面会持续分享FastApi以及项目实战的各种干货知识。FastApi是一个现代、快速(高性能)的基于Python3.6+的web框架,用于构建API。它旨在使API开发更快,更简单,并且更具有扩展性。FastApi甚至可以和Go类似拥有极高的性能,除此之外,FastApi相较于Django和Flask,相对比较年轻,不过这并不影响FastApi的使用和维护。而本文将针对FastApi框架,从入门FastApi的重要知识点到项目部署,进行一个详细介绍。下面跟着笔者,直接往下看正文...

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 1733

双参数威布尔分布(Weibull分布)参数计算(根据故障数据,求双参数威布尔分布的参数详细步骤)

根据故障数据求威布尔分布参数步骤 根据众多文献研究,设备故障数据大多服从指数分布、威布尔分布或对数正态分布。其中威布尔分布较为常用,本文主要介绍威布尔分布的简单应用,并根据某设备故障数据为例简单介绍威布尔分布参数的计算方法。 参考文献11参考文献22 1.双参数威布尔分布的概率密度函数、概率分布函数、可靠度函数: 2.预处理故障数据 将故障数据按时间排序,假设设备分别在以下时间点失效:11.1 、23.5、58.4……则将此时间从小到大排序。并计算中位秩。中位秩的计算公式如下: 其中i表示第几个数据,n

biaochengxiaobai的博客 4万+

手把手教你用GD32F407VET6的EXMC驱动外部SRAM,搞定大内存需求

本文详细介绍了如何使用GD32F407VET6的EXMC外设驱动外部SRAM,解决嵌入式开发中的大内存需求问题。通过硬件连接方案、EXMC时序配置与初始化步骤,以及软件集成与内存管理技巧,帮助开发者快速实现内存扩展。特别适合需要处理图形显示缓冲、音频处理等大内存场景的GD32F407开发者。

weixin_30752699的博客 346

流媒体协议-RTMP简介

与rtsp 不同,RTSP(Real-Time Streaming Protocol)是一个控制协议,负责控制媒体流的传输,但不传输媒体数据本身。RTSP 可以通过 TCP 或 UDP 传输 RTP 包来传输音视频数据。 RTMP(Real-Time Messaging Protocol)是一个综合性的协议,不仅可以传输音视频数据,还可以传输信令控制指令。RTMP 使用 TCP 作为传输协议,可以直接在 TCP 连接上传输音视频数据,也可以传输控制指令,实现了音视频流的实时传输和控制

xiaoshuaijinniu的博客 4550

可视化工具--Plotly

随着信息技术的发展和硬件设备成本的降低,当今的互联网存在海量的数据,要想快速从这些数据中获取更多有效的信息,数据可视化是重要的一环。对于Python语言来说,比较传统的数据可视化模块是Matplotlib,但它存在不够美观、静态性、不易分享等缺点,限制了Python在数据可视化方面的发展。   为了解决这个问题,新型的动态可视化开源模块Plotly应运而生。由于Plotly具有动态、美观、易用、种类丰富等特性,所以一经问世就受到开发人员的喜爱。

YFater的博客 1万+

[原创]Step by step 实现自己的AI知识库问答(二)

对小白很友好的AI智能问答开发保姆级教程,适合初级开发者、学生阅读参考,无限制分享,欢迎转载。在这个章节中,我们使用了百度千帆作为知识库,通过简单的代码调用API实现了智能问答。

BaiRiYiSanJin的博客 1471

黑猫带你学eMMC协议第2篇:eMMC部分相关名词释义

1 前言 1.1 声明 本文依据eMMC JEDEC5.1、网络资料及个人工作经验整理而成,如有错误请留言。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 本文背景 本文关键词不包括emmc jedec5.1协议第3章节:《Terms and definitions》内容。关于emmc协议层的关键词,直接查阅spec相关章节即可,清晰明了,此处没必要再列出。 本文为本人工作学习中常听到或常用到关乎于emmc/flash的一些关键词合集,没有固定分类,不需要强行记忆,供查询使用。 1.

黑猫奥利奥的博客 7432

基于RK3588调试WiFi模块AIC8800

本文介绍了在RK3588平台上移植AIC8800 WiFi模块驱动的过程。开发环境基于Linux 6.1内核和Buildroot文件系统。驱动移植步骤包括:将驱动包放入SDK指定目录、修改Makefile、编译内核、放置固件文件、手动加载驱动模块等。文章还分析了两种常见异常情况:无法识别模块(检查USB信号线路和供电)和偶发断连(检查硬件连接和调整PHY寄存器)。成功加载后可通过ifconfig看到wlan0节点。

qq_45147279的博客 667

SAP 费用化采购订单简介

费用性采购的核心特点费用性采购的流程费用性采购的优势适用场景业务场景前台操作1、创建成本中心---KS012、创建采购订单---ME21N3、采购订单审批---ME29N4、采购订单收货---MIGO5、查看成本中心费用---S_ALR_870136116、控制费用化的采购订单自动带出科目和成本中心SAP费用性采购(Expense Procurement)指的是企业在采购过程中,直接将采购的物料或服务成本计入费用科目,而不是记入库存账户的采购行为。

我小时候很黑的博客 2016

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: redis分布式锁
下一篇: 数组基础-笔记
WishYouAFortune
博客等级 码龄15年 1465粉丝 111原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值