FastAPI 快速入门
本文介绍了FastAPI框架的基础知识及使用方法。FastAPI是一个基于Python的现代异步Web框架,需要配合ASGI服务器(如Uvicorn)使用。文章详细讲解了HTTP协议中GET和POST方法的区别,并通过示例代码演示了如何快速创建FastAPI项目、定义路由接口(GET/POST/PUT/DELETE)以及实现路由分发。还展示了如何通过Request对象接收请求参数,使用Fastma
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/foo(item_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"}
更多推荐
所有评论(0)