二维码
from fastapi import APIRouterfrom .v1 import v1_routerapi_router = APIRouter()api_router.include_router(v1_router, prefix="/v1")__all__ = ["api_router"]

代码作用概述

这段代码是基于 FastAPI 框架的,主要用于创建一个 API 路由器,并将版本 v1 的路由包含进来,为构建管理系统等项目提供了基础路由架构。

这是v1版本的路由信息:

from fastapi import APIRouterfrom app.core.dependency import DependPermissonfrom .apis import apis_routerfrom .auditlog import auditlog_routerfrom .base import base_routerfrom .depts import depts_routerfrom .menus import menus_routerfrom .roles import roles_routerfrom .users import users_routerv1_router = APIRouter()v1_router.include_router(base_router, prefix="/base")v1_router.include_router(users_router, prefix="/user", dependencies=[DependPermisson])v1_router.include_router(roles_router, prefix="/role", dependencies=[DependPermisson])v1_router.include_router(menus_router, prefix="/menu", dependencies=[DependPermisson])v1_router.include_router(apis_router, prefix="/api", dependencies=[DependPermisson])v1_router.include_router(depts_router, prefix="/dept", dependencies=[DependPermisson])v1_router.include_router(auditlog_router, prefix="/auditlog", dependencies=[DependPermisson])

代码详细讲解

  • from fastapi import APIRouter :从 FastAPI 框架中导入 APIRouter 类。APIRouter 是 FastAPI 提供的一个用于定义路由的类,它可以帮助我们将不同的路由组织和管理起来,便于后续的扩展和维护。通过使用 APIRouter,可以将相关的路由逻辑分组,提高代码的可读性和可维护性。

  • from .v1 import v1_router :从当前包(假设这段代码位于一个包内)的 v1 模块中导入 v1_router。这里的 “.” 表示当前包,表明 v1 模块与当前文件在同一目录下的包结构中。而 v1_router 应该是在 v1 模块中定义好的另一个 APIRouter 实例,包含了版本 v1 的具体 API 路由,例如用户管理、订单管理等功能的路由。

  • api_router = APIRouter() :创建一个名为 api_router 的 APIRouter 实例。这个实例将成为整个应用的主路由器,用于管理和组织所有的 API 路由。

  • api_router.include_router(v1_router, prefix="/v1") :将之前导入的 v1_router 包含到 api_router 中,并为其添加一个前缀 "/v1"。这样,当访问以 "/v1" 开头的 URL 路径时,就会匹配 v1_router 中定义的路由。例如,如果 v1_router 中有一个路由 "/users",那么实际访问时就需要使用 "/v1/users" 这个路径。这种方式实现了版本控制,方便后续对不同版本的 API 进行管理和扩展。

  • __all__ = ["api_router"] :定义了一个名为 all 的列表,其中包含了一个字符串 "api_router"。这是 Python 的一个惯例,用于指定当使用 from 模块名 import * 时,应该导入哪些变量或对象。在这里,它表示当其他模块通过 from 模块本名 import * 的方式导入时,只会导入 api_router 这个变量。这样可以控制模块的公开接口,避免不必要的变量被外部导入,提高代码的封装性和可维护性。

开发技巧

  • 模块化与分层结构 :这种将不同的路由版本分开到不同模块(如 v1 模块)的做法体现了模块化的设计思想。在实际开发管理系统时,可以进一步将不同的功能模块(如用户管理、权限管理、数据管理等)分别放到不同的文件或目录中每个功能模块都有自己的路由器,然后在主路由器中进行整合。同时,还可以考虑分层架构,如将路由层、服务层、数据访问层等分开,提高代码的可维护性和可测试性。

  • 路由前缀的使用 :通过给不同版本的路由添加前缀,可以很容易地实现 API 的版本控制。在开发过程中,当需要对 API 进行升级或修改时,可以创建新的版本目录(如 v2),在其中定义新的路由,并为其指定相应的前缀,而不会影响到旧版本的路由。这样可以保证系统的稳定性,同时也能满足不同客户端对不同版本 API 的需求。


__all__ 是一个特殊的变量,用于定义模块的公共接口

它是一个列表,包含了模块中希望对外公开的变量、函数或类的名称。当其他模块使用 from 模块名 import * 的方式导入时,Python 会根据 __all__ 中的列表来决定导入哪些内容。

代码示例

假设有一个名为 module.py 的模块:

# module.pydef public_function():    print("This is a public function.")def _private_function():    print("This is a private function.")class PublicClass:    passclass _PrivateClass:    pass__all__ = ["public_function", "PublicClass"]

如果另一个模块使用 from module import * 来导入:

from module import *public_function()  # 可以正常调用# _private_function()  # 无法调用,因为不在 __all__ 中# _PrivateClass()  # 同样无法调用

为什么要使用 __all__

  1. 控制模块的公开接口只允许其他模块导入 __all__ 中列出的内容,隐藏内部实现细节。

  2. 提高代码的可维护性:避免外部模块导入不必要的内容,减少耦合。

  3. 清晰的模块设计:明确模块的公共功能,方便其他开发者理解和使用。

在当前代码中的作用

在你的代码中:

__all__ = ["api_router"]

这表示当其他模块使用 from 当前模块 import * 时,只会导入 api_router 这个变量。其他变量或函数(比如 v1_router)不会被导入

使用场景

  • 限制导入内容:防止外部模块意外导入内部实现细节。

  • 明确模块功能:让其他开发者清楚知道模块提供的主要功能。

  • 避免命名冲突:当模块中有多个类似名称的变量或函数时,通过 __all__ 明确指定哪些是对外的。

总结

__all__ 是一种约定,用于明确模块的公共接口。它不会影响模块内部的逻辑,但会影响其他模块通过 import * 方式导入的内容。在实际开发中,合理使用 __all__ 可以提高代码的可读性和可维护性。


©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
  • 验证码
◎已有 270 人评论
搜索
作者介绍
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×