FastApi个人笔记

FastApi笔记

学习FastApi建议直接看官方文档:官方文档

文章目录

  • FastApi笔记
    • 一、环境准备
      • 1.1 安装Fast Api
    • 二、第一个Restful API
      • 2.1 创建第一个代码框架
            • async作用[(引自CSDN)](https://blog.csdn.net/The_Time_Runner/article/details/105646363):
      • 2.2 运行第一个代码
      • 2.3 Swag UI界面 (1)
      • 2.4 直接启动应用
      • 2.5 Swag UI界面 (2)
    • 三、路径参数
      • 3.1 路径参数存在于uri当中
      • 3.2 参数类型限定
      • 3.3 API定义的顺序影响
      • 3.4 通过枚举定义参数值的可选项
    • 四、查询参数
      • 4.1 查询参数存在于 uri 当中
      • 4.2 可选查询参数

一、环境准备

1.1 安装Fast Api

pip3 install fastapi[all]

[all] 指安装fastapi下提供的所有插件

二、第一个Restful API

2.1 创建第一个代码框架

main.py中写下如下代码:

from fastapi import FastApi

app = FastApi() 						# 构造一个app对象

@app.get('/helloworld')							# 定义所需要开发的api
async def index():						# async为异步函数
    return {'message': 'Hello World'}
# 程序到这里就拥有了/helloworld这个api
async作用(引自CSDN):

常规函数开始执行后一直运行到return实现退出,如果需要能够中断的函数,就需要添加async关键字。

async用来声明一个函数为异步函数,异步函数的特点就是能在函数执行过程中被挂起,去执行其他异步函数,等挂起条件消失后再回来执行。

因为fastapi很快,它所有基于api的定义都是异步化的,所以读用async关键字

2.2 运行第一个代码

在终端中输入:

uvicorn main:app --reload

由于fastapi不具备基本的网关服务,所以它需要借助于外部的网关服务器来提供web访问的基础架构。

uvicorn:就是一个非常高性能的SGI网关服务器。

main:app:表示加载main.py中的app程序 --reload表示进行加载

运行成功后,终端可能会显示如下代码:

(venv) PS C:\Users\UserName\Desktop\First_FastApi> uvicorn main:app --reload
INFO:     Will watch for changes in these directories: ['C:\\Users\\UserName\\Desktop\\First_FastApi']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [34768] using WatchFiles
INFO:     Started server process [20412]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     127.0.0.1:57829 - "GET / HTTP/1.1" 404 Not Found
INFO:     127.0.0.1:58012 - "GET / HTTP/1.1" 404 Not Found

“Not Found”?这就对了,因为上面的代码没有定义根

代码中补充即可:

from fastapi import FastAPI

app = FastAPI()

@app.get('/')
async def root():
    return {'message' : 'Hello Root'}

@app.get('/helloworld')
async def read_get():
    return {'message': 'hello world'}

这个时候去重新刷新网站即可,网站会显示:

{
    "message": "Hello Root"
}

这里可以发现启动程序时uvicorn main:app --reload中最后加入--reload的作用其实就是在刷新网页时自动加载新的保存好的代码配置

如果想要访问/helloworld所在的api

在浏览器搜索框中改为如下地址即可,

http://127.0.0.1:8000/helloworld

返回的结果使用了jason,这就是最基本的restful api,是基于http请求的

2.3 Swag UI界面 (1)

在浏览器搜索框中将地址改为,

http://127.0.0.1:8000/docs

出现了这样的界面,在这里可以轻松的看到当前服务器中定义了哪些api。

这一点对于要开发restful api的人来讲,是很好的选择。

2.4 直接启动应用

在代码中进行如下修改即可,

from fastapi import FastAPI
import uvicorn # 导入uvicorn的服务调用启动服务器的方法

app = FastAPI()

@app.get('/')
async def root():
    return {'message' : 'Hello Root'}

@app.get('/helloworld')
async def read_get():
    return {'message': 'hello world'}

if __name__ == '__main__':
    uvicorn.run("main:app", reload=True) # 和命令行中的代码一致

完成修改后,直接点击if __name__ == '__main__':左边的绿色三角形,并在内置终端中点击网址即可在web中打开程序。

2.5 Swag UI界面 (2)

在swag ui中点击Try it out>Execute,也就是尝试>执行。可以做到直接向服务器发送请求并看到送回的返回结果。

三、路径参数

3.1 路径参数存在于uri当中

http://localhost:8000/users/2
@app.get('/users/{user_id}')
async def get_user(user_id: int):
    return {'user_id': user_id}

上面两端代码分别对应 uri 和 python 中用来提取信息的代码,其中 users/ 后面的内容 2 就是路径参数,fastapi 会根据定义的格式,自动提取出参数。上述例子中,当前端输入该地址后,fastapi 会提取 2 作为 user_id 的参数。

3.2 参数类型限定

对于下面的代码:

from fastapi import FastAPI
import uvicorn # 导入uvicorn的服务调用启动服务器的方法

app = FastAPI()

@app.get('/users/{user_id}')
async def get_user(user_id):
    return {'user': f'This is the user for {user_id}'}

if __name__ == '__main__':
    uvicorn.run("main:app", reload=True) # 和命令行中的代码一致

运行后在浏览器中查看, 再次可以看到swag UI的强大之处:

上述代码中并没有指定实际的类型,有时我们需要限定输入的数据类型。如果输入的数据类型不符合输入要求的类型,需要进行报错而不是直接使用。比如上述例子中我要求 id 是整数而不能是字符串,就要加上: int来进行类型的申明:

from fastapi import FastAPI
import uvicorn # 导入uvicorn的服务调用启动服务器的方法

app = FastAPI()

@app.get('/users/{user_id}')
async def get_user(user_id: int):
    return {'user': f'This is the user for {user_id}'}

if __name__ == '__main__':
    uvicorn.run("main:app", reload=True) # 和命令行中的代码一致

运行成功后路径参数不是 int 类型会有如下报错:

这里的报错提示是可以进行定制的,这里暂且不谈。

3.3 API定义的顺序影响

from fastapi import FastAPI
import uvicorn                  # 导入uvicorn的服务调用启动服务器的方法

app = FastAPI()

@app.get('/users/{user_id}')
async def get_user(user_id: int):
    return {'user': f'This is the user for {user_id}'}

@app.get('/users/current')
async def get_current_user():
    return {'user': f'This is current user.'}

if __name__ == '__main__':
    uvicorn.run("main:app", reload=True) # 和命令行中的代码一致

上面代码运行后,在Web中访问

http://127.0.0.1:8000/users/12

会返回

{
    "user": "This is the user for 12"
}

但是如果访问

http://127.0.0.1:8000/users/current

就会返回

{
    "detail": [
        {
            "type": "missing",
            "loc": [
                "query",
                "user_id"
            ],
            "msg": "Field required",
            "input": null
        }
    ]
}

为什么会出现这种情况?

因为user/current是满足第一种api的定义模式的格式要求,所以第一个api定义会执行并返回类型报错。换言之,fastapi并不知道你后面还定义了一个可以使用的方法。

但如如果将顺序反过来:

from fastapi import FastAPI
import uvicorn                  # 导入uvicorn的服务调用启动服务器的方法

app = FastAPI()

@app.get('/users/current')
async def get_current_user():
    return {'user': f'This is current user.'}

@app.get('/users/{user_id}')
async def get_user(user_id: int):
    return {'user': f'This is the user for {user_id}'}

if __name__ == '__main__':
    uvicorn.run("main:app", reload=True) # 和命令行中的代码一致

功能就正常了,current可以被正常识别,int型也能识别出来。

说白了,这个例子告诉我们,当api的格式定义很相似的时候,我们要主要api定义的顺序,以防止某些定义不能正常使用。

也就是“小范围在前,大范围在后”。

3.4 通过枚举定义参数值的可选项

如果路径的参数是一个性别,我们该怎么提供一个选择项呢?- (男/女)。也就是如何去在 swag UI 中提供一个选择菜单的意思。

from fastapi import FastAPI
import uvicorn                  # 导入uvicorn的服务调用启动服务器的方法
from enum import Enum

app = FastAPI()

class Gender(str, Enum):        # Gender 同时继承了`字符串类型` 和 `枚举类型`
    male = "male"
    female = "female"

@app.get('/student/{gender}')
async def get_gender(gender: Gender):
    return {'student': f'This is a {gender.value} student'}

if __name__ == '__main__':
    uvicorn.run("main:app", reload=True) # 和命令行中的代码一致

上述代码定义了一个 Gender 的性别类,它同时继承了字符串和枚举类型,Gender类都是一个可供枚举的字符串值,只能选择枚举可能性中的一种。

运行后在swag UI中显示如下:

这个方法对于调用者来讲没有太大差别,但对于测试者来说,有极大的方便之处。

四、查询参数

4.1 查询参数存在于 uri 当中

http://localhost:8000/users?page_index=1&page_size=10
from fastapi import FastAPI
import uvicorn                  # 导入uvicorn的服务调用启动服务器的方法

app = FastAPI()

@app.get('/users')
async def get_user(page_index: int, page_size: int):
    return {'page info': f'index : {page_index} size: {page_size}'}

if __name__ == '__main__':
    uvicorn.run("main:app", reload=True) # 和命令行中的代码一致

在uri中以xxx?xxx的键值对形式来表示查询的路径参数,使用&将它们串在一起。

4.2 可选查询参数

如果uri中只给了page_index不给page_size就叫可选查询参数

from fastapi import FastAPI
import uvicorn                  # 导入uvicorn的服务调用启动服务器的方法
from typing import Optional

app = FastAPI()

@app.get('/users')
async def get_user(page_index: int, page_size: Optional[int] = 30):
    return {'page info': f'index : {page_index} size: {page_size}'}

if __name__ == '__main__':
    uvicorn.run("main:app", reload=True) # 和命令行中的代码一致

在int前加一个Optional即可,这里缺省值设为30。

可以看到,默认的值为 14,是缺省值。

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

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

相关文章

Shell编程debug

debug调试 debug方法 sh -x显示脚本执行过程set命令设置开始debug和结束debug的位置显示脚本某一部分执行过程,解决复杂脚本故障 示例: sh -x 显示脚本执行过程 set显示脚本的部分执行过程 set -x 开始调试,从这里开始显示脚本的详细执行过…

WebAssembly 入门教程 c++、python编译wasm

WebAssembly 入门 了解 wasm 使用场景,复杂对象传递和经验法则。 简介 WebAssembly 是一种新的编码方式,可以在现代的网络浏览器中运行。它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并…

Docker入门篇来啦~

文章目录 1虚拟化技术1.1 硬件级虚拟化1.2 操作系统级虚拟化 2 Docker是什么2.1 Docker介绍2.2 容器和虚拟机的区别2.3 为什么使用Docker 3 Docker运行环境部署3.1 Docker安装3.2 Docker服务启动 4 Docker核心组件4.1 镜像4.1.1 镜像的基本概念4.1.2 镜像的组成结构4.1.3 镜像的…

上位机图像处理和嵌入式模块部署(树莓派4b使用lua)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 lua是一个脚本语言,比c语言开发容易,也没有python那么重,整体使用还是非常方便的。一般当成胶水语言进行开发&a…

Linux基础指令001

名称日期版本说明作者了解并熟练运用Linux基础指令2024/05/04v0.0.1汇总篇lgb 一,了解Linux,并安装 Linux是一套免费使用和自由传播的类Unix操作系统,是一个多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协…

编译 x264 for iOS

文章目录 编译在 FFMpeg 启用 x264其他编译选项报错处理 环境 : macOS 14.3.1 x264 - 20191217-2245 编译 1、下载 x264 源码 http://download.videolan.org/pub/videolan/x264/snapshots/ 这里我下载x264-snapshot-20191217-2245.tar.bz2 (截止2024-…

【计算机网络】计算机网络的定义和分类

一.定义 计算机网络并没有一个精确和统一的定义,在计算机网络发展的不同阶段,人们对计算机网络给出了不同的定义,这些定义反映了当时计算机网络技术的发展水平。 例如计算机网络早期的一个最简单定义:计算机网络是一些互连的、自…

10个使用NumPy就可以进行的图像处理步骤

图像处理是一种数学计算。数字图像由称为像素的彩色小点组成。每个像素由红、绿、蓝(RGB)三个独立的颜色组成。每个像素中的主色由每个RGB分量的数值决定。 本文将介绍10个使用使用NumPy就可以进行的图像处理步骤,虽然有更强大的图像处理库,但是这些简单…

dp 动态规划 力扣

64. 最小路径和 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 1: 输入:grid [[1,3,1],[1,5,1],[4,2,1]] 输…

IDA使用教程-IDA7.5版本

IDA使用教程 右键使用32bit分析程序 一,IDA修改,保存 修改:IDA->edit->Patch program(补丁程序)->Assemble(汇编)修改。 保存: IDA->edit->Patch program->Appl…

【数据结构】--- 深入剖析二叉树(上篇)--- 初识树和二叉树

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 数据结构之旅 🏠 初识树 📒 树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点…

Leetcode354. 俄罗斯套娃信封问题

Every day a Leetcode 题目来源:354. 俄罗斯套娃信封问题 解法1:动态规划 我们必须要保证对于每一种 w 值,我们最多只能选择 1 个信封。 首先我们将所有的信封按照 w 值第一关键字升序、h 值第二关键字降序进行排序; 随后我们…

QT+串口调试助手+扩展版

前言:此文章是这篇文章的拓展 QT串口调试助手基本版-CSDN博客,如果需要独立完成串口调试助手直接看基本版文章即可,如果需要完成串口调试助手的其他功能,参考拓展版。 一、更新QT串口调试助手UI界面 1、ui串口设置界面 2、ui串口…

Java与Go: 生产者消费者模型

什么是生产者消费者模型 生产者-消费者模型(也称为生产者-消费者问题)是一种常见的并发编程模型,用于处理多线程或多进程之间的协同工作。该模型涉及两个主要角色:生产者和消费者,一个次要角色:缓冲区。 生…

Unity---版本控制软件

13.3 版本控制——Git-1_哔哩哔哩_bilibili Git用的比较多 Git 常用Linux命令 pwd:显示当前所在路径 ls:显示当前路径下的所有文件 tab键自动补全 cd:切换路径 mkdir:在当前路径下创建一个文件夹 clear:清屏 vim…

EtherCAT通信总线状态监视

1、EtherCAT总线运动控制学习笔记 EtherCAT总线运动控制学习笔记(RXXW_Dor)_汇川pdo控制命令607a-CSDN博客文章浏览阅读3.3k次,点赞3次,收藏9次。说到总线控制,就要说到报文、对象字典、PN通信我们大部分会说报文,EtherCAT通信我们常说对象字典,叫法不一样,但是原理基…

OneFlow深度学习框原理、用法、案例和注意事项

本文将基于OneFlow深度学习框架,详细介绍其原理、用法、案例和注意事项。OneFlow是由中科院计算所自动化研究所推出的深度学习框架,专注于高效、易用和扩展性强。它提供了一种类似于深度学习库的接口,可以用于构建神经网络模型,并…

数据结构---单链表

题目&#xff1a;构造一个单链表。 使用的软件&#xff1a;VS2022使用的语言&#xff1a;C语言使用的项目&#xff1a;test.c Setlist.h Setlish.c 项目实践&#xff1a; Setlist.h的代码为&#xff1a; #pragma once#include<stdio.h> #include<stdlib.h> #incl…

SQL注入基础-3

一、宽字节注入 1、宽字节&#xff1a;字符大小为两个及以上的字节&#xff0c;如GBK&#xff0c;GB2312编码 2、数据库使用GBK编码时&#xff0c;会将两个字符合并为一个汉字(宽字节)。特殊值字符如单引号都会被转义【--->\】&#xff0c;如sqli-lads第32关&#xff0c;输…

【C++】学习笔记——vector_2

文章目录 七、vector2. vecotr的使用3. vector的模拟实现 未完待续 七、vector 2. vecotr的使用 上节我们以二维数组结束&#xff0c;这一节我们以二维数组开始。 // 二维数组 vector<vector<int>> vv;二维数组在底层是连续的一维数组。vv[i][j] 是怎样访问的&a…
最新文章