头条项目-获取新闻分类

目录

一.具体实现步骤

1.模块化路由(新建一个controller)

2.定义模型类(新建一个实体类)

3.在crud文件夹里面创建文件,封装操作数据库的方法(写mapper)

4.在路由处理函数里面调用crud封装好的方法,响应结果给前端(在controller中,使用mapper)

5.将新闻路由routers/news.py,挂载到main,py

二.运行项目,测试效果


一.具体实现步骤

1.模块化路由(新建一个controller)

在routers目录(我们之前创建的目录),新建一个news.py文件,专门存放新闻相关的接口

python 复制代码
#1.导入APIRouter
from fastapi import APIRouter

#2.创建APIRouter实例
router = APIRouter(prefix="/api/news", tags=["news"])

# "获取新闻分类"
@router.get("/categories")
async def getCategories(skip: int = 0, limit: int = 100):
    # 先模拟一下返回结果就行
    return {
        "code": 200,
        "message": "success",
        "data": "新闻分类列表"
    }

测试效果:

(我们以后测试后端接口,可以直接在docs接口文档中测试就行,无需额外使用ApiFox或者postman来测试了)

2.定义模型类(新建一个实体类)

python 复制代码
from datetime import datetime

from sqlalchemy import DateTime, Integer, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column

# 创建基类(存放一些共用的字段,供不同的表使用)
# 举例:新闻表、新闻分类表,都有创建时间、更新时间,这俩字段就能拎出来
class Base(DeclarativeBase):
    created_at: Mapped[datetime] = mapped_column(
        DateTime,
        default=datetime.now(),
        comment="创建时间"
    )
    updated_at: Mapped[datetime] = mapped_column(
        DateTime,
        default=datetime.now(),
        comment="更新时间"
    )

# 创建"新闻分类"表的模型类
class Category(Base):
    # 表名
    __tablename__ = "news_category"
    # 各个字段
    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, comment="分类id")
    name: Mapped[str] = mapped_column(String(50), unique=True, nullable=False, comment="分类名称")
    sort_order: Mapped[int] = mapped_column(Integer, default=0, nullable=False, comment="排序")
    # toString
    def __repr__(self):
        return f"<Category(id={self.id}, name={self.name}, sort_order={self.sort_order})>"

3.在crud文件夹里面创建文件,封装操作数据库的方法(写mapper)

python 复制代码
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from models.news import Category

# 定义mapper:查询新闻分类
async def getCategories(db: AsyncSession, skip: int = 0, limit: int = 100):
    #1.定义sql语句
    stmt = select(Category).offset(skip).limit(limit)
    #2.让db执行sql语句
    result = await db.execute(stmt)
    #3.获取执行结果并返回
    return result.scalars().all()

4.在路由处理函数里面调用crud封装好的方法,响应结果给前端(在controller中,使用mapper)

python 复制代码
from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from config.db_conf import get_db
from crud import news

#2.创建APIRouter实例
router = APIRouter(prefix="/api/news", tags=["news"])

# "获取新闻分类"
@router.get("/categories")
async def getCategories(db:AsyncSession = Depends(get_db), skip: int = 0, limit: int = 100):
    #1.从数据库查询
    categories = await news.getCategories(db,skip,limit)
    #2.返回结果
    return {
        "code": 200,
        "message": "查询新闻分类成功",
        "data": categories
    }

解读:

①db:AsyncSession = Depends(get_db)这是在注入数据库会话,从而才能执行sql,而且这个get_db获取数据库会话的方法,就是我们在config/db_conf.py文件中提前写好的。

②from crud import news这是导入我们刚刚定义的mapper

5.将新闻路由routers/news.py,挂载到main,py

二.运行项目,测试效果

直接打开http://127.0.0.1:8000/docs,即项目的接口文档。

响应结果如下

python 复制代码
{
  "code": 200,
  "message": "查询新闻分类成功",
  "data": [
    {
      "updated_at": "2026-02-07T19:05:16",
      "sort_order": 1,
      "created_at": "2026-02-07T19:05:16",
      "id": 1,
      "name": "头条"
    },
    {
      "updated_at": "2026-02-07T19:05:16",
      "sort_order": 2,
      "created_at": "2026-02-07T19:05:16",
      "id": 2,
      "name": "社会"
    },
    {
      "updated_at": "2026-02-07T19:05:16",
      "sort_order": 3,
      "created_at": "2026-02-07T19:05:16",
      "id": 3,
      "name": "国内"
    },
    {
      "updated_at": "2026-02-07T19:05:16",
      "sort_order": 4,
      "created_at": "2026-02-07T19:05:16",
      "id": 4,
      "name": "国际"
    },
    {
      "updated_at": "2026-02-07T19:05:16",
      "sort_order": 5,
      "created_at": "2026-02-07T19:05:16",
      "id": 5,
      "name": "娱乐"
    },
    {
      "updated_at": "2026-02-07T19:05:16",
      "sort_order": 6,
      "created_at": "2026-02-07T19:05:16",
      "id": 6,
      "name": "体育"
    },
    {
      "updated_at": "2026-02-07T19:05:16",
      "sort_order": 7,
      "created_at": "2026-02-07T19:05:16",
      "id": 7,
      "name": "科技"
    },
    {
      "updated_at": "2026-02-07T19:05:16",
      "sort_order": 8,
      "created_at": "2026-02-07T19:05:16",
      "id": 8,
      "name": "财经"
    }
  ]
}