【写在前面】:大家好,我是【猪葛】
一个很看好AI前景的算法工程师
我自己会给公司开发很多人工智能的算法功能,但是因为后端人员很忙,
所以我自己得把功能封装成接口部署到服务器,
所以自己就自学FastAPI框架
这个框架非常适合新手入门后端的接口开发
我自己也就学了不到一个星期,现在将学习过程的笔记分享出来
希望能给大家一点帮助,如果你也喜欢我的博客,欢迎关注我的动态,一起学习一起进步
入门从第一章到第四章即可
提升从第五章到第七章
进阶从第八章往后,以后会进一步更新更高级用法
本篇博客学习目标:1、学会用fastAPI框架搭建最简单的服务器
文章目录
一、fastapi的安装
1-1、使用pip安装
安装fastapi的语句
pip install fastapi
当然你可以使用国内阿里云镜像源进行安装,会快很多,上面的语句变成下面的:
pip install fastapi -i https://mirrors.aliyun.com/pypi/simple
因为fastapi启动依赖于uvicorn,所以我们还需要安装uvicorn
pip install uvicorn -i https://mirrors.aliyun.com/pypi/simple
到这里,fastapi就安装完毕了,下面我们来验证一下安装是否成功
1-2、验证是否安装成功
新建名字叫main.py的文件,将下面内容复制到里面去
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {
"message": "Hello World"}
然后使用终端开启uvicorn服务
uvicorn main:app --reload
uvicorn main:app 命令指:
main: main.py 文件(也可理解为Python模块).app: main.py 中app = FastAPI()语句创建的app对象.--reload: 在代码改变后重启服务器,只能在开发的时候使用
你将会看到如下的输出:
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [8438] using statreload
INFO: Started server process [8440]
INFO: Waiting for application startup.
INFO: Application startup complete.
然后打开浏览器,输入: http://127.0.0.1:8000。看看有没有打印出:"message": "Hello World" 这句话,如果有,表示安装成功。
如果你此时访问 http://127.0.0.1:8000/docs。你将会看到自动生成的API交互文档。这点很重要,也是fastapi的一个优点。
1-3、了解FastAPI程序结构
编写一个简单的FastAPI程序需要五个小步骤,先看一个完整例子
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {
"message": "Hello World"}
第一步,导入FastAPI
from fastapi import FastAPI
第二步,创建一个app实例
app = FastAPI()
第三步,编写一个 路径操作装饰器
@app.get("/")
需要注意的两点是:
-
你可以将get操作方法更改成
@app.post()、@app.put()、@app.delete()等方法 -
你可以更改相应的路径("/")为自己想要的,例如我更改为("/hello_word/")
第四步,编写一个路径操作函数,例如下面代码中的root函数。它位于路径操作装饰器下方(见上方例子)
def root():
return {
"message": "Hello World"}
这个函数的返回值可以是
dict,list,单独的值,比如str,int,或者是Pydantic模型
第五步、运行开发服务器uvicorn main:app --reload即可访问api链接。
例如我在终端运行uvicorn main:app --reload之后,在浏览器输入127.0.0.1:8000,出现"message": "Hello World"这句话。
在这里可以自己指定要运行的服务器ip和端口号。
例如:uvicorn main:app --host 127.0.0.1 --port 8001 --reload表示指定本地电脑为服务器,端口号为8001。下面所有的代码演示都默认这个本机ip地址和8001端口号
本节总结:虽然这个例子很简单,但是却把编写fastapi的流程和结构全都包含在里面了,以后功能的细化无非就是细化第三和第四部分而已。
二、路径操作装饰器中的路径参数
2-1、声明路径参数
使用Python格式字符串的语法声明路径参数,例子
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id):
return {
"item_id": item_id}
上述代码运行之后,路径参数 item_id 的值会作为read_item函数参数 item_id 的值。
因此,如果你运行上述示例,然后跳转到 http://127.0.0.1:8000/items/foo, 你将会看见这样的回应:
{
"item_id":"foo"}
2-2、声明路径参数的类型
使用 标准的Python类型注释在函数中声明路径参数的类型,例子1:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {
"item_id": item_id}
上述将参数item_id的类型定义为int类型
例子2:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_name}")
def read_item(item_name: str):
return {
"item_id": item_name}
上述将参数item_name的类型定义为str类型
当我们声明了路径参数的类型,如果我们在访问链接的时候提供的参数类型不对,FastAPI还会自动为我们做数据校验的功能,在开发和调试与您的API交互的代码时,这非常有用。注意两点:
- 所有的数据验证都是由
Pydantic实现的. - 你可以用同样的类型声明比如
str,float,bool或者其他更复杂的类型.
2-3、限定路径参数有效值
有时候我们只想给某个路径参数传递某几个固定的有效值,我们就可以使用到这个方法。先看完整例子代码
from enum import Enum
from fastapi import FastAPI
class Hjx_Class_name(str, Enum):
Name = 'huangjunx'
Year = 18
Id = '20153201072'
student = True
app = FastAPI()
@app.get('/hjx/{hjx_man}')
def root(hjx_man: Hjx_Class_name):
return {
'status': hjx_man}
第一步、创建一个继承str和Enum的类,并创建几个类属性,这些类属性的值将是可用的有效值
第二步、声明路径参数。路径参数hjx_man的值将传递给函数root的参数hjx_man,并且这个值的取值范围只能是Hjx_Class_name类中类属性的值。
例如你访问http://127.0.0.1:8001/hjx/20153201072,得到的会是:{“status”:“20153201072”}
例如你访问http://127.0.0.1:8001/hjx/True,得到的会是:{“status”:“True”}
这样我们就能做到给某个路径参数传递某几个固定的有效值了。
进一步,我们还可以在root函数里面调用这个类的类属性。通过Hjx_Class_name.Name进行调用。下面例子无论你使用哪个类属性的值访问,结果都是{"status":"huangjunx"}
from enum import Enum
from fastapi import FastAPI
class Hjx_Class_name(str, Enum):
Name = 'huangjunx'
Year = 18
Id = '20153201072'
student = True
app = FastAPI()
@app.get('/hjx/{hjx_man}')
def root(hjx_man: Hjx_Class_name):
return {'status': Hjx_Class_name.Name}
2-4、路径参数的值是路径类型变量
假设现在你有一个路径操作:/files/{file_path},但是你需要 file_path 本身包含一个 路径, 比如 home/johndoe/myfile.txt.
因此, 文件路径可能是: /files/home/johndoe/myfile.txt
在这种情况,我们使用Path转换器就可以进行转换了。使用以下方法声明值是路径的路径参数。
/files/{file_path:path}
语句表示的意思是:参数的名字是 file_path,:path说明参数file_path对应的类型是 path 类型.
from fastapi import FastAPI
app = FastAPI()
@app.get("/files/{file_path:path}")
def read_user_me(file_path):
return {
"file_path": file_path}
三、查询参数
3-1、查询参数概念
当你声明不属于路径参数的其他函数参数时,它们将自动解释为“Query”参数,也就是查询参数。
查询参数就是一系列在URL?之后的key-value键值对,每对键值对用 & 分割开来。例如
http://127.0.0.1:8000/items/?skip=0&limit=10
查询参数有两个,一个是skip,一个是limit,它们的值分别为0,10
由于它们都是URL的一部分,所以 “本质上” 它们都是字符串。
但是当你需要使用Python类型来声明query参数的时候(例如用int),他们就会被转换为相应的类型并且依据这个类型来验证传入参数。
适用于Path参数的所有过程也适用于Query参数
- 编辑器支持
- 数据解析
- 数据验证
- 自动文档
from fastapi import FastAPI
app = FastAPI()
@app.get("/files/")
def add(num1: int=2, num2 int=8):
return {
"num1 + num2 = ": num1 + num2}
当你使用浏览器访问http://127.0.0.1:8001/files/?num1=2&num2=3,你会得到:{"num1 + num2 = ":5}
3-2、给查询参数设置默认值
query参数类不是path中固定的一部分,所以他们是可选的,并且可以有默认值。
例如上面的例子,当你使用浏览器访问http://127.0.0.1:8001/files/,你会得到:{"num1 + num2 = ":10}
3-3、设置可选的查询参数
声明可选的Query参数,只需要将他们的默认值设置为None即可。
关于查询参数还需要注意以下几点:
- 如果设置的查询参数没有默认值不是None,那么这个查询参数就是必需查询参数,必须要传入,否则会报错
- 查询参数可以和路径参数结合使用
四、请求体
4-1、什么是请求体(Request Body)
当您需要将数据从客户端(例如浏览器)发送到API时,可以将其作为 “请求体” 发送。
请求体是客户端发送到您的API的数据。 响应体是您的API发送给客户端的数据。
API几乎总是必须发送一个响应体,但是客户端并不需要一直发送请求体。
定义请求体,需要使用 Pydantic 模型。注意以下几点
- 不能通过GET请求发送请求体
- 发送请求体数据,必须使用以下几种方法之一:POST(最常见)、PUT、DELETE、PATCH
4-2、如何实现请求体
实现请求体总共包含三个步骤。
第一步,从pydantic中导入BaseModel
from pydantic import BaseModel
第二步,创建请求体数据模型
声明请求体数据模型为一个类,且该类继承 BaseModel。所有的属性都用标准Python类。和查询参数一样:数据类型的属性如果不是必须的话,可以拥有一个默认值或者是可选None。否则,该属性就是必须的。
例如,声明了一个JSON对象
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
所以访问链接的时候传入的请求体可以是下面两种,
{
"name": "Foo",
"description": "An optional description",
"price": 45.2,
"tax": 3.5
}
另一种可以不传递默认值或者是可选值,(注意字典后面最后一个元素不需要逗号)
{
"name": "Foo",
"price": 45.2
}
第三步、将模型定义为参数
将上面定义的模型添加到你的路径操作中,就和定义Path和Query参数一样的方式:
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return item
声明参数的类型为你创建的模型 Item
这样当你使用postman选择post方法访问链接并传递一个值为
{
“name”: “Foo”,
“price”: 45.2
}
的请求体之后,会得到输出
{
“name”: “Foo”,
“price”: 45.2
}
4-3、ubuntu18安装postman
因为后续经常会用到使用post方法访问api,为了方便测试,我们安装postman。
安装命令
sudo snap install postman
运行完之后会看到类似下面的语句,说明安装完毕
postman 7.35.0 from Postman, Inc. (postman-inc✓) installed
4-4、使用请求体模型
在函数内部,可以直接访问模型对象的所有属性:
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return item.name
注意以下几点:
- 可以同时定义路径参数和请求体参数
- 可以同时定义路径参数和查询参数和请求体参数,如果path中声明了某个参数,那么这个参数将作为路径参数是使用;如果参数是 单一类型(例如
int,float,str,str,bool等),它将被解释为 query参数。
五、给查询参数设置验证条件(字符串验证)
5-1、查询参数简单回顾
我们先通过一个例子看一下查询参数是什么
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/")
def read_items(q: str = None):
results = {
"items": 'Big preoject'}
if q:
results.update({
"q": q}) # 给字典results添加一个健值对{"q": q}
return results
查询 参数 q 是 str 类型, 并且默认为 None, 说明它是可选的
5-2、为查询参数添加验证
我们将设置:即使 q 是可选的,只要提供了q,它的长度就不能超过50个字符
第一步,导入Query
from fastapi import FastAPI, Query
第二步、使用 Query 设置max_length验证
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
def read_items(q: str = Query(None, max_length=50)):
results = {
"items": 'Big preoject'}
if q:
results

本文作者作为算法工程师,因后端人员忙,自学FastAPI框架并分享学习笔记。涵盖FastAPI安装、路径操作装饰器中的路径参数、查询参数、请求体等内容,还介绍了参数验证、多种参数使用、模型创建等,适合新手入门后端接口开发。
最低0.47元/天 解锁文章
1万+





