一、简介
1. FastAPI 概述
FastAPI 是一款现代、轻量、高性能的 Python Web 框架,专门用来快速构建 API(应用程序编程接口)。它是近几年 Python 生态中最火的 Web 框架之一,尤其适合快速上手写后端接口。
2. FastAPI 适用场景
- 前后端分离项目的后端 API;
- 微服务间的接口;
- 数据接口(如提供数据库商品信息);
- 快速原型开发。
二、FastAPI+Python 前后端交互全解析
作为初学者,刚接触前后端交互时容易对概念感到困惑。本文将结合实战代码,解析 FastAPI 接口编写、requests 库使用及 Request 对象原理,帮助你理解前后端交互的底层逻辑。
1. 前后端交互的本质
可以用餐厅点餐来比喻:
- 前端:顾客,负责提需求(如要一碗牛肉面);
- 后端:厨房,负责处理需求(煮面、加牛肉);
- HTTP 协议:服务员,负责传递需求和结果;
- 请求:顾客喊'服务员,来碗牛肉面';
- 响应:服务员端上做好的菜或告知'卖完了'。
Python 前端脚本相当于'顾客',FastAPI 后端相当于'厨房',两者靠 HTTP 协议传递数据。
2. 项目需求
使用 FastAPI 实现以下功能:
- 用户注册:用户名和密码不为空,用户名长度大于 6,密码长度大于 8 且包含下划线、字母和数字,且用户名不重复。
- 用户登录:用户名和密码正确则提示欢迎,否则提示错误。
- 查看用户信息:获取已注册用户列表。
3. 代码设计思路
本项目采用'FastAPI 后端接口服务 + Python 命令行前端客户端'组合。
1. 前端代码设计思路
前端主要使用 requests 库发送 HTTP 请求。
import requests
requests 是 Python 生态中最常用的 HTTP 请求库,它将用户的操作转换成后端能识别的 HTTP 请求,并带回响应结果。
while True:
user_input = input('1、注册\n2、登录\n3、查看\n4、退出\n请输入你要进行的操作:')
if user_input == '1':
user = input("用户名:")
password = input("密码:")
res = requests.post("http://127.0.0.1:8000/user/register", params={"username": user, "password": password})
result = res.json()
print(f'{result["result"]}')
elif user_input == '2':
user = input("用户名:")
password = input("密码:")
res = requests.post("http://127.0.0.1:8000/user/login", params={"username": user, "password": password})
result = res.json()
print(f'{result["result"]}')
elif user_input == '3':
res = requests.post("http://127.0.0.1:8000/user/logout")
result = res.json()
print(result)
elif user_input == '4':
break
else:
print("输入的操作错误请重新输入")
while True:创建无限循环,直到用户选择退出。input(...):打印菜单等待用户输入。requests.post:发送 POST 请求到后端接口。params:将字典转换为 URL 查询参数拼接到地址后。res.json():将 JSON 格式字符串转换为 Python 字典。
注意:requests.post 返回的是 Response 对象,直接打印会显示 <Response [状态码]>。需使用 .json() 或 .text 解析内容。
2. 后端代码(FastAPI)设计思路
后端核心定位是提供数据处理接口,维护用户数据并校验业务规则。
import uvicorn
from fastapi import FastAPI, Request
import re
app = FastAPI()
user_datas = [{"username": "admin123", "password": "admin_123"}]
def judgment(username, password):
# 条件:用户名长度>6,密码长度>=9,含数字/字母/下划线,无非法字符
if len(username) > 6 and re.match(r'^(?=.*\d)(?=.*[a-zA-Z])(?=.*_)[a-zA-Z0-9_]{9,}$', password):
return 1
else:
return 0
@app.post('/user/register')
def register(request: Request):
username = request.query_params['username']
password = request.query_params['password']
for i in user_datas:
if i['username'] == username:
return {"result": "注册失败:用户名重复"}
if judgment(username, password):
user_data = {"username": username, "password": password}
user_datas.append(user_data)
print(user_datas)
return {"result": f"注册成功:{username}成功注册"}
else:
return {"result": "注册失败:注册的用户名和密码未满足要求"}
@app.post('/user/login')
def login(request: Request):
username = request.query_params['username']
password = request.query_params['password']
if judgment(username, password):
for i in user_datas:
if i['username'] == username and i['password'] == password:
return {'result': f"登录成功:{username}欢迎"}
return {"result": "登录失败:用户名或密码错误"}
else:
return {'result': '登录失败:用户名或密码输入不正确'}
@app.post('/user/logout')
def logout():
return user_datas
if __name__ == '__main__':
uvicorn.run("main:app", host="127.0.0.1", port=8000)
import uvicorn:导入 ASGI 服务器,用于监听网络请求。@app.post:装饰器,定义路由路径和请求方法。request.query_params:获取 URL 中的查询参数。uvicorn.run:启动服务,绑定 IP 和端口。
3. 前后端交互底层逻辑总结
- 协议是桥梁:前后端靠 HTTP 协议沟通,遵循 GET/POST 方法及 JSON 格式规范。
- 数据是核心:前端传需求数据,后端返结果数据,格式统一为 JSON。
- 校验是保障:前端减少无效请求,后端防止恶意输入。
- 状态码是信号:200 表示成功,400 表示用户错误,500 表示后端错误。
三、完整代码展示
在 PyCharm 中创建两个 .py 文件:main.py(后端)和 test.py(前端)。
main.py (后端)
见上文'后端代码设计思路'部分。 运行流程:导入模块 -> 创建 app 实例 -> 初始化模拟数据库 -> 定义校验函数 -> 启动 Uvicorn 监听 8000 端口。
test.py (前端)
见上文'前端代码设计思路'部分。 运行流程:导入 requests -> 进入 while 循环 -> 打印菜单 -> 接收指令 -> 发送请求 -> 解析响应。
联动运行流程
- 先启动后端文件,再启动前端文件。
- 用户在前端输入指令(如 1 注册),前端发送 POST 请求至后端对应接口。
- 后端接收请求,校验数据,返回 JSON 结果。
- 前端解析 JSON 并打印结果,继续等待输入。
- 后端持续运行直到手动停止(Ctrl+C)。
数据传递类型
- 后端:返回 Python 字典或列表,FastAPI 自动序列化为 JSON。
- 前端:使用
res.json()将 JSON 字符串反序列化为 Python 字典或列表。
