Python Web 开发实战:构建 FastAPI 在线商店系统

ops/2024/12/19 19:06:15/

Python Web 开发实战:构建 FastAPI 在线商店系统

目录

  1. 🛍️ 商品管理
  2. 🛒 购物车与结算
  3. 💳 支付集成(模拟支付)
  4. ⚙️ 系统拓展与优化建议

🛍️ 1. 商品管理

商品管理是任何在线商店系统的核心功能,主要包括商品的添加、编辑、删除和查询。在 FastAPI 中,商品管理的实现通常包括定义商品的数据模型、创建 API 端点来处理商品的增、删、改、查操作,并且对请求数据进行验证和格式化。

1.1 商品数据模型

商品模型是整个商店系统中最基础的数据结构,包含了商品的各种信息,例如名称、价格、库存数量和描述等。使用 Pydantic 定义商品模型,并确保所有传入数据的类型和结构符合要求。

python">from pydantic import BaseModel
from typing import Optionalclass Product(BaseModel):name: strdescription: strprice: floatstock: intimage_url: Optional[str] = None  # 商品图片链接,非必填项

1.2 商品管理 API 设计

接下来,我们设计几个 API 端点来处理商品的增、删、改、查操作。通过这些端点,商店管理员可以管理商品信息。

1.2.1 创建商品

该 API 用于商店管理员添加新商品。通过 POST 请求提交商品信息,FastAPI 会自动验证数据并将其保存到数据库

python">from fastapi import FastAPI, HTTPExceptionapp = FastAPI()# 模拟商品数据库
product_db = {}@app.post("/add_product/")
async def add_product(product: Product):product_id = len(product_db) + 1  # 使用商品数作为 IDproduct_db[product_id] = product.dict()return {"message": "Product added successfully", "product_id": product_id}
1.2.2 编辑商品

编辑商品时,管理员可以通过商品 ID 更新其信息。对于已存在的商品,系统将会更新相关的字段。

python">@app.put("/update_product/{product_id}")
async def update_product(product_id: int, product: Product):if product_id not in product_db:raise HTTPException(status_code=404, detail="Product not found")product_db[product_id].update(product.dict())return {"message": "Product updated successfully"}
1.2.3 删除商品

删除商品的 API 通过商品 ID 将其从商品数据库中移除。

python">@app.delete("/delete_product/{product_id}")
async def delete_product(product_id: int):if product_id not in product_db:raise HTTPException(status_code=404, detail="Product not found")del product_db[product_id]return {"message": "Product deleted successfully"}
1.2.4 查询商品

通过 GET 请求,用户或管理员可以查询某个商品的信息或列出所有商品。以下代码提供了两种查询方式:根据商品 ID 查询,和查询所有商品。

python">@app.get("/get_product/{product_id}")
async def get_product(product_id: int):if product_id not in product_db:raise HTTPException(status_code=404, detail="Product not found")return product_db[product_id]@app.get("/get_all_products/")
async def get_all_products():return product_db

通过这些 API,商店管理员可以非常方便地管理商品信息。


🛒 2. 购物车与结算

购物车是在线商店系统的重要组成部分,用户可以将商品加入购物车并进行结算。结算时会计算总价,并生成订单。该模块主要包括购物车的添加、查看和结算功能。

2.1 购物车数据模型

购物车由商品和数量组成,每个用户拥有一个独立的购物车。购物车模型需要记录商品 ID 和对应的数量。

python">class CartItem(BaseModel):product_id: intquantity: intclass ShoppingCart(BaseModel):items: dict[int, CartItem]  # 商品ID映射到购物车项total_price: float = 0.0  # 总价格,系统自动计算

2.2 添加商品到购物车

通过该 API,用户可以将商品添加到购物车。如果该商品已经在购物车中,系统会更新其数量。

python">@app.post("/add_to_cart/{user_id}")
async def add_to_cart(user_id: int, cart_item: CartItem):cart = shopping_carts.get(user_id, ShoppingCart(items={}))if cart_item.product_id in cart.items:cart.items[cart_item.product_id].quantity += cart_item.quantityelse:cart.items[cart_item.product_id] = cart_itemcart.total_price = sum(item.quantity * product_db[item.product_id]["price"] for item in cart.items.values())shopping_carts[user_id] = cartreturn {"message": "Item added to cart", "total_price": cart.total_price}

2.3 查看购物车

用户可以查询自己购物车中的所有商品以及总价。以下是查看购物车内容的接口。

python">@app.get("/view_cart/{user_id}")
async def view_cart(user_id: int):cart = shopping_carts.get(user_id, ShoppingCart(items={}))return {"items": cart.items, "total_price": cart.total_price}

2.4 结算购物车

结算时,系统会计算购物车内所有商品的总价并生成订单。以下代码展示了结算过程。

python">@app.post("/checkout/{user_id}")
async def checkout(user_id: int):cart = shopping_carts.get(user_id)if not cart or len(cart.items) == 0:raise HTTPException(status_code=400, detail="Cart is empty")order_id = len(orders_db) + 1order = {"user_id": user_id,"items": cart.items,"total_price": cart.total_price,"status": "pending"}orders_db[order_id] = ordershopping_carts[user_id] = ShoppingCart(items={})  # 清空购物车return {"message": "Checkout successful", "order_id": order_id}

💳 3. 支付集成(模拟支付)

支付功能是电子商务平台的关键环节,通常与第三方支付平台(如支付宝、微信支付、Stripe 等)集成。在此示例中,我们将实现一个模拟支付接口,模拟支付成功和失败的场景。

3.1 支付数据模型

模拟支付时,系统需要一个支付请求的数据模型,包含订单 ID 和支付金额。

python">class PaymentRequest(BaseModel):order_id: intamount: float

3.2 模拟支付接口

此接口将模拟支付过程,支付成功时返回支付成功的消息,支付失败时返回失败的消息。

python">@app.post("/process_payment/")
async def process_payment(payment: PaymentRequest):order = orders_db.get(payment.order_id)if not order:raise HTTPException(status_code=404, detail="Order not found")if order["total_price"] != payment.amount:raise HTTPException(status_code=400, detail="Payment amount mismatch")# 模拟支付成功order["status"] = "paid"return {"message": "Payment successful", "order_status": order["status"]}

3.3 支付状态查询

用户可以查询订单的支付状态。支付状态包含:待支付、已支付、支付失败等。

python">@app.get("/order_status/{order_id}")
async def order_status(order_id: int):order = orders_db.get(order_id)if not order:raise HTTPException(status_code=404, detail="Order not found")return {"order_id": order_id, "status": order["status"]}

通过这些模拟支付的 API,用户可以进行虚拟支付操作,查看支付状态,并完成整个购买流程。


⚙️ 4. 系统拓展与优化建议

虽然基本的在线商店系统已经搭建完成,但仍然有多个方面可以进一步优化和拓展:

  1. 数据库持久化:目前的系统数据保存在内存中,实际应用中需要使用数据库(如 PostgreSQL、MySQL 或 MongoDB)来持久化数据。
  2. 用户注册与认证:用户注册、登录、密码管理等功能尚未实现,可以通过 FastAPI 提供的 OAuth2 认证和 JWT 实现用户认证与授权。
  3. 支付集成:可以进一步集成真实的支付系统,如 Stripe 或 PayPal,来实现真实支付功能。
  4. 性能优化:在高并发的情况下,

系统可以使用异步处理、消息队列等方式来提高性能。


http://www.ppmy.cn/ops/143262.html

相关文章

Flask入门:打造简易投票系统

目录 准备工作 创建项目结构 编写HTML模板 编写Flask应用 代码解读 进一步优化 结语 Flask,这个轻量级的Python Web框架,因其简洁和易用性,成为很多开发者入门Web开发的首选。今天,我们就用Flask来做一个简单的投票系统&am…

监控易监测对象及指标之:宝兰德中间件JMX监控指标解读

监控易作为一款全面的IT监控软件,能够为企业提供深入、细致的监控服务,确保企业IT系统的稳定运行。在本文中,我们将详细解读监控易针对宝兰德中间件JMX的监控指标,以帮助用户更好地理解和应用这些监控数据。 监测指标概览&#x…

Java Stream 流的使用

Java Stream 流的使用 在实际生产中,几乎很少使用for循环的结构进行操作,Java 8 提供的Stream可以大大提高程序员的生产力,由于自己之前对于Stream 流使用的并不是很熟练,所以在这里进行简单的总结归纳。 最后熟练的使用Stream流&…

IO的进阶

目录 1. 字符流转向字节流的桥梁1.1 OutputStreamWriter1.2 InputStreamReader1.3 编码与解码1.4 常见编码方式1.5 编码与解码的注意事项 2.Properties2.1概述2.2 Properties 的常用方法2.3 Properties 的应用场景2.4 实例 3.序列化3.1 ObjectOutputStream 4.字符编码4.1 ASCII…

《网络对抗技术》Exp9 Web安全基础

实验目标 理解常用网络攻击技术的基本原理。 实验内容 Webgoat实践下相关实验。 实验环境 macOS下Parallels Desktop虚拟机中(网络源均设置为共享网络模式): Kali Linux - 64bit(攻击机,IP为10.211.55.10)…

C++ OCR证件照文字识别

一.引言 文字识别,也称为光学字符识别(Optical Character Recognition, OCR),是一种将不同形式的文档(如扫描的纸质文档、PDF文件或数字相机拍摄的图片)中的文字转换成可编辑和可搜索的数据的技术。随着技…

科研绘图系列:R语言绘制韦恩图(Venn plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据处理画图系统信息介绍 R语言绘制韦恩图(Venn plot) 加载R包 library(tidyverse) library(ggplot2) library(ggrepel) library(dplyr) library(rea…

docker安装mysql5.7

1、宿主机创建映射目录 mkdir -p /data/mysql/log mkdir -p /data/mysql/data mkdir -p /data/mysql/conf这里我放在了/data/mysql目录下 2、拉取mysql镜像 docker pull mysql:5.7注意是5.7版本,如果是8版本操作会略有不同,下篇文章介绍安装8版本的操…