学习链接:https://www.bilibili.com/video/BV18F4m1K7N3?spm_id_from=333.788.player.switch&vd_source=031c58084cf824f3b16987292f60ed3c&p=11

FastAPI 是一个用于构建 API 的现代快速python web框架。异步框架,易于学习,自动生成交互式文档。

Uvicorn 是基于 uvloop 和 httptools 构建的非常快速的 ASGI 服务器。ASGI(Asynchronous Server Gateway Interface) 是 Python 的一个标准协议。它规定了:“服务器”和“Web 应用”之间该怎么沟通。FastAPI 是按 ASGI 标准写的,所以它需要一个支持 ASGI 的服务器来运行。

可在Pypi包仓库查看FastAPI的介绍:Pypi-FastAPI

1. 安装 FastAPI 和 uvicorn(web服务器)

Win11中pycharm中,使用python3.10,安装包

pip install fastapi -i https://pypi.tuna.tsinghua.edu.cn/simple # 指定从清华镜像源下载
pip install uvicorn -i https://pypi.tuna.tsinghua.edu.cn/simple

上面的命令用uv替换:uv add fastapi uvicorn 添加依赖。

2. 前端基础

2.1 前后端分离 与 前后端不分离

不分离:后端“包办婚姻”,连 UI 都给你生成好;
分离:前后端“自由恋爱”,只通过 API 约定“接头暗号”。

2.2 URL ,HTTP,GET&POST方法

URL是定位资源的地址,HTTP是传输时的应用层协议。HTTP依赖URL来确定资源的目标,浏览器解析URL后通过HTTP向目标资源发送HTTP请求。在客户机和服务器之间进行请求-响应时,两种最常被用到的HTTP方法是:GET 和 POST。

URL(统一资源定位符)的构成:

协议://主机:端口/路径?查询参数
 │     │     │    │      └─────▶ query string(查询字符串)
 │     │     │    └────────────▶ 路径(Path)
 │     │     └─────────────────▶ 端口(Port)
 │     └───────────────────────▶ 主机(Host)
 └─────────────────────────────▶ 协议(Protocol)

关键点:只有 ? 后面的部分(查询参数)会出现在 URL 中,且只用于 GET 请求!

2.3 GET vs POST:数据怎么“送”给服务器?

特性 GET 方法 POST 方法
数据位置 放在 URL 的 ? 后面(如 ?name=alice 放在 HTTP 请求体(Body)里(不在 URL 中)
用途 传输少量字符,从服务器读取资源,不改变服务器状态(如搜索关键词、分页参数) 对目标资源提交数据以供其处理,改变服务器状态(如登录、上传文件、提交表单)
安全性 因URL可以会被记录,所以 ❌ 不安全(密码会暴露在浏览器历史、日志中)
类比:明信片,信息写在表面(URL),所有人都能看到。
✅ 相对安全(数据不在 URL)而是在请求体中。
类比:密封信件,地址写在信封(URL),内容藏在信纸里(Body),只有收件人能看。
幂等性 ✅ 可重复请求(刷新页面不会重复提交) ❌ 非幂等(刷新可能重复提交订单)
URL 长度限制 有(一般 ≤ 2048 字符) 无(理论上可传大文件)

3. 快速创建 FastAPI 项目

from fastapi import FastAPI
import uvicorn

# 实例化对象
app = FastAPI()

# 路由
@app.get("/") # 装饰器。它告诉 FastAPI:“当有人通过浏览器访问这个网站的根目录(/)时,请执行下面那个函数。”
async def root():
	return {"message": "Hello my Boss"}

@app.get("/get")
def get_test():
	return {"message": "get method"}

@app.post("/post")
def post_test():
	return {"message": "post method"}

@app.put("/put")
def put_test():
	return {"message": "put method"}

@app.delete("/delete")
def delete_test():
	return {"message": "delete method"}

# 启动项目
if __name__ == '__main__': # 只有直接运行这个文件时,才执行下面的代码
	uvicorn.run("1fastapi:app", host="127.0.0.1", port=8080, reload=True) # 启动服务器的命令。

上面几行代码就快速建立了一个FastAPI项目。运行后可以通过访问 http://127.0.0.1:8080来访问这个FastAPI装饰器,通过访问 http://127.0.0.1:8080/docs可以看到一个渲染过的界面。 其中的 post, put, delete, get 为 HTTP 协议中不同的方法,可以通过 Fastman 软件来测试。

HTTP 标准规定的方法:看该博客简单了解。

4. 路由分发

就是一个界面有多个子界面,都写到一个1fastapi.py中代码太大,有耦合,为了解耦合,将一个子界面上的对象放到一个目录之下:

在每个子目录单独写类似如下代码:

from fastapi import APIRouter # 子路由

api_book = APIRouter() # 实例化子路由对象


@api_book.get("/")
async def root():
	return {"message": "book : get"}

@api_book.get("/get")
def get_test():
	return {"message": "book : get method"}

@api_book.post("/post")
def post_test():
	return {"message": "book : post method"}

@api_book.put("/put")
def put_test():
	return {"message": "book : put method"}

@api_book.delete("/delete")
def delete_test():
	return {"message": "book : delete method"}

main 主文件增加:

app.include_router(api_book, prefix="/book", tags=["图书接口"])
app.include_router(api_cbs, prefix="/cbs", tags=["出版社接口"])
app.include_router(api_zz, prefix="/zz", tags=["作者接口"])

访问 http://127.0.0.1:8080/docs看到:
在这里插入图片描述

5. request 对象

增加如下代码:

from fastapi import Reauest

@app.get("/get_with_params")
async def get_with_params(request: Request):
	get_test = request.query_params
	print(get_test)
	return {"message": "get ---- method"}

@app.post("/post_with_body")
async def post_with_body(request: Request):
	post_test = await request.json() # 这里一定要加上await,为什么?答:“等 Body 数据准备好,再解析成 JSON”
	print(post_test)
	return {"message": "post ---- method"}

然后就可以通过在 Fastman 平台上测试,与这个 FastAPI 框架通过HTTP收发信息了。如下所示:

# Fastman选择post方法,指定发送如下内容
http://127.0.0.1:8080/post_with_body 
# 外加JSON格式数据 :
{
    "message": "hello lyrix"
}

# 即可在Fastman收到应答,且FastAPI收到我发送的JSON内容:
{'message': 'hello lyrix'}
INFO:     127.0.0.1:56452 - "POST /post_with_body HTTP/1.1" 200 OK

----------------------------------------------------------------------------------

# Fastman选择get方法,指定发送如下内容
http://127.0.0.1:8080/get_with_params?username=lyrix&answer=12345

#即可在Fastman收到应答,且FastAPI收到我发送的内容:
username=lyrix&answer=12345
INFO:     127.0.0.1:59522 - "GET /get_with_params?username=lyrix&answer=12345 HTTP/1.1" 200 OK

post和get都能向FastAPI发送内容,这有何区别?

6. 静态文件

from fastapi.staticfiles import StaticFiles

app = FastAPI()

# 设置静态文件路由
app.mount("/upimg", StaticFiles(directory="upimg", name="upimg"))

在upimg放一个照片名为 1.jpg, 然后浏览器访问:http://127.0.0.1:8080/upimg/1.jpg 就可以看到照片。

7. jinjia2

Jinja2是Python下一个被广泛应用的模版引擎

8. HTTPException

HTTPException 是 FastAPI 提供的一种“抛出 HTTP 错误”的方式。一旦 raise HTTPException(...) 被执行,函数立即中断,FastAPI 会自动捕获这个异常,并返回一个标准的 HTTP 错误响应给客户端(比如浏览器或 API 调用者)。

from fastapi import FastAPI, HTTPException

app = FastAPI()

items = {"foo": "The Foo Wrestlers"}


@app.get("/items/{item_id}")
async def read_item(item_id: str):
    if item_id not in items:
        raise HTTPException(status_code=404, detail="Item not found")
    return {"item": items[item_id]}

生成的响应

如果客户端请求 http://example.com/items/fooitem_id"foo"),该客户端将收到一个 200 的 HTTP 状态码,以及一个 JSON 响应:

C:\Users> curl http://localhost:8080/items/foo
{"item":"The Foo Wrestlers"}

但是,如果客户端请求 http://example.com/items/aaa(一个不存在的 item_id “bar”`),该客户端将收到一个 404 的 HTTP 状态码(“未找到”错误),以及一个 JSON 响应:

C:\Users\nxg01742>curl http://localhost:8080/items/aaa
{"detail":"Item not found"}
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐