分层架构在博客批评功能中的应用与实现

打印 上一主题 下一主题

主题 1732|帖子 1732|积分 5200

title: 分层架构在博客批评功能中的应用与实现
date: 2025/04/24 12:45:43
updated: 2025/04/24 12:45:43
author: cmdragon
excerpt:
分层架构在Web应用开发中提拔代码可维护性和扩展性,博客批评功能采用四层布局筹划:路由层处理HTTP哀求与响应,服务层封装业务逻辑,模型层定义数据布局和数据库操作,Schema层负责数据验证与序列化。这种布局实现职责分离、易于测试、代码复用和扩展灵活。模型层通过prefetch_related预加载关联数据,Schema层使用继续布局淘汰重复定义,服务层封装业务逻辑并处理异常,路由层通过路径参数和依赖注入实现接口。项目布局清楚,运行环境配置简单,常见报错处理方案美满。
categories:
tags:

  • 分层架构
  • Web开发
  • 博客批评功能
  • 数据验证
  • 业务逻辑封装
  • 路由接口
  • 项目布局
扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
探索数千个预构建的 AI 应用,开启你的下一个伟大创意
1. 分层架构核心概念与优势

开发Web应用程序时,合理的分层架构能明显提拔代码可维护性和扩展性。对于博客批评功能,我们采用四层布局筹划:

  • 路由层(Routers):处理HTTP哀求与响应
  • 服务层(Services):封装业务逻辑
  • 模型层(Models):定义数据布局和数据库操作
  • Schema层(Schemas):数据验证与序列化
这种分层布局的优势在于:

  • 职责分离:各层专注单一职责
  • 易于测试:可对每层进行独立单位测试
  • 代码复用:通用逻辑可跨多个路由复用
  • 扩展灵活:修改某一层不影响其他层
2. 模型层筹划与实现
  1. # models/comment.py
  2. from tortoise.models import Model
  3. from tortoise import fields
  4. class Comment(Model):
  5.     id = fields.IntField(pk=True)
  6.     content = fields.TextField()
  7.     author_id = fields.IntField()
  8.     post_id = fields.IntField()
  9.     created_at = fields.DatetimeField(auto_now_add=True)
  10.     parent_id = fields.IntField(null=True)  # 支持回复评论
  11.     class Meta:
  12.         table = "comments"
  13.     @classmethod
  14.     async def get_comments_with_author(cls, post_id: int):
  15.         return await cls.filter(post_id=post_id).prefetch_related('author')
复制代码
模型层要点说明:

  • 使用prefetch_related实现关联数据的预加载
  • parent_id字段实现批评的树形布局
  • 自定义查询方法封装复杂查询逻辑
  • Datetime字段自动记录创建时间
3. Schema数据验证筹划
  1. # schemas/comment.py
  2. from pydantic import BaseModel
  3. from datetime import datetime
  4. class CommentBase(BaseModel):
  5.     content: str
  6.     post_id: int
  7.     parent_id: int | None = None
  8. class CommentCreate(CommentBase):
  9.     pass
  10. class CommentResponse(CommentBase):
  11.     id: int
  12.     author_id: int
  13.     created_at: datetime
  14.     replies: list['CommentResponse'] = []
  15.     class Config:
  16.         orm_mode = True
复制代码
Schema筹划原则:

  • 使用继续布局淘汰重复定义
  • 单独的Create Schema用于创建验证
  • Response Schema包罗ORM转换配置
  • 递归定义实现批评的嵌套回复布局
4. 服务层业务逻辑封装
  1. # services/comment.py
  2. from models.comment import Comment
  3. from schemas.comment import CommentCreate, CommentResponse
  4. class CommentService:
  5.     @staticmethod
  6.     async def create_comment(comment_data: CommentCreate, user_id: int) -> Comment:
  7.         try:
  8.             return await Comment.create(
  9.                 **comment_data.dict(),
  10.                 author_id=user_id
  11.             )
  12.         except Exception as e:
  13.             raise ValueError("评论创建失败") from e
  14.     @staticmethod
  15.     async def get_post_comments(post_id: int) -> list[CommentResponse]:
  16.         comments = await Comment.get_comments_with_author(post_id)
  17.         return await CommentResponse.from_queryset(comments)
复制代码
服务层特点:

  • 静态方法方便直接调用
  • 异常处理封装底层数据库错误
  • 业务逻辑与数据访问解耦
  • 返回类型提示增强代码可读性
5. 路由层接口实现
  1. # routers/comments.py
  2. from fastapi import APIRouter, Depends
  3. from services.comment import CommentService
  4. from schemas.comment import CommentCreate, CommentResponse
  5. router = APIRouter(prefix="/posts/{post_id}/comments", tags=["comments"])
  6. @router.post("/", response_model=CommentResponse)
  7. async def create_comment(
  8.         post_id: int,
  9.         comment_data: CommentCreate,
  10.         user_id: int = Depends(get_current_user)
  11. ):
  12.     return await CommentService.create_comment(comment_data, user_id)
  13. @router.get("/", response_model=list[CommentResponse])
  14. async def get_comments(post_id: int):
  15.     return await CommentService.get_post_comments(post_id)
复制代码
路由层关键点:

  • 使用路径参数post_id关联文章
  • 依赖注入获取当前用户
  • 清楚的响应模型定义
  • 路由分组增强文档可读性
6. 项目布局组织

推荐的项目目录布局:
  1. /blog_api/
  2. ├── main.py
  3. ├── models/
  4. │   ├── __init__.py
  5. │   └── comment.py
  6. ├── schemas/
  7. │   └── comment.py
  8. ├── services/
  9. │   └── comment.py
  10. ├── routers/
  11. │   └── comments.py
  12. └── dependencies.py
复制代码
7. 运行环境配置

安装依赖:
  1. pip install fastapi uvicorn tortoise-orm pydantic python-multipart
复制代码
数据库配置示例:
  1. # main.py
  2. from tortoise import Tortoise
  3. async def init_db():
  4.     await Tortoise.init(
  5.         db_url='sqlite://db.sqlite3',
  6.         modules={'models': ['models.comment']}
  7.     )
  8.     await Tortoise.generate_schemas()
复制代码
8. 课后Quiz

题目1:当收到422 Validation Error时,应该如何快速定位题目?
答案解析

  • 检查哀求体是否符合Schema定义
  • 查看错误详情中的"loc"字段定位错误字段
  • 验证字段类型和约束条件
  • 使用Swagger文档测试接口
题目2:如何优化获取批评列表时的N+1查询题目?
答案解析

  • 使用prefetch_related预加载关联数据
  • 在ORM查询中指定需要的关系字段
  • 使用Tortoise的annotate进行批量查询
  • 在Service层实现数据批量加载
9. 常见报错处理

报错1:RuntimeError - Event loop is closed
  1. # 解决方法
  2. import asyncio
  3. if __name__ == "__main__":
  4.     asyncio.run(main())
  5. # 预防建议
  6. 确保数据库连接在应用关闭时正确释放
复制代码
报错2:ValidationError - field required
  1. # 原因分析
  2. 请求体缺少Schema要求的必填字段
  3. # 解决方案
  4. 1.
  5. 检查前端发送的JSON结构
  6. 2.
  7. 在Schema中设置Optional字段
  8. 3.
  9. 使用exclude_unset模式处理部分更新
复制代码
报错3:OperationalError - Connection refused
  1. # 排查步骤
  2. 1.
  3. 检查数据库连接字符串
  4. 2.
  5. 验证数据库服务是否运行
  6. 3.
  7. 检查网络连接和端口开放情况
  8. 4.
  9. 查看数据库日志定位连接问题
复制代码
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完备的文章:分层架构在博客批评功能中的应用与实现 | cmdragon's Blog
往期文章归档:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

东湖之滨

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表