【Python开发】FastAPI 11:构建多文件应用

这篇具有很好参考价值的文章主要介绍了【Python开发】FastAPI 11:构建多文件应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以往的文件都是将对外接口写在一个文件里边,而作为应用来说,接口是不可避免分散到多个文件中的,比如某文件负责注册登录模块,某文件负责内管模块,某文件负责业务模块等。FastAPI 也提供了APIRouter 这一工具来进行灵活构建应用,本文将是它的示例。

目录

1 APIRouter

1.1 APIRouter 使用

1.2 其他模块的引入

2 app 项目示例

2.1 文件结构

2.2 其他 文件

2.3 main 文件

2.4 API 文档


📌 源码地址:

https://gitee.com/yinyuu/fast-api_study_yinyu

1 APIRouter

大家可以看到,前边的示例均是以 app = FastAPI() 作为路由,但是它只适合小项目,如果接口按模块进行划分就不满足了。而 APIRouter 正实现了接口按模块的功能,以使其井井有条。

1.1 APIRouter 使用

类似 app = FastAPI()

from fastapi import APIRouter #导入 APIRouter

router = APIRouter()

@router.get("/users/", tags=["users"])
async def read_users():
    return [{"username": "Rick"}, {"username": "Morty"}]

可以将 APIRouter 视为一个小号 FastAPI 类,所有相同的选项都得到支持,比如 parameters、responses、dependencies、tags 等等。

此示例中,该变量被命名为 router,但你可以根据你的想法自由命名。

1.2 其他模块的引入

类似 FastAPI ,我们还可以通过 prefixtagsdependencies responses 等参数来减少重复代码和增加效率。比如有两个接口:

  • /items/
  • /items/{item_id}

他们的路径前缀一样,那么我们通过以下方式简化代码:

  • prefix:/items,前缀,不能以 / 作为结尾,不然回合路径重合
  • tags:items 标签,主要在 api 文档中用于分类
  • responses:额外的响应模型,所有接口都将拥有
  • dependencies:依赖,比如 get_token_header 依赖项。
from fastapi import APIRouter, Depends, HTTPException
 
from ..dependencies import get_token_header #通过 .. 对依赖项使用了相对导入,具体代码可看第二章

router = APIRouter(
    prefix="/items",
    tags=["items"],
    dependencies=[Depends(get_token_header)],
    responses={404: {"description": "Not found"}},
)

@router.get("/")
async def read_items():
    return fake_items_db

@router.get("/{item_id}")
async def read_item(item_id: str):
    if item_id not in fake_items_db:
        raise HTTPException(status_code=404, detail="Item not found")
    return {"name": fake_items_db[item_id]["name"], "item_id": item_id}

最终结果是项目相关的路径现在为:

  • /items/
  • /items/{item_id}

2 app 项目示例

接下来以 app 项目为例,展示一下多文件应用的构建。

2.1 文件结构

📌 结构如下:
【Python开发】FastAPI 11:构建多文件应用

app 目录包含了所有内容,他是一个 Python 包:

  • app/main.pymain 模块,也是项目的主文件,或者说启动类
  • app/dependencies.py:存放依赖项
  • app/routers/ :Python 子包:
    • app/routers/items.py:存放 ietms 相关接口
    • app/routers/users.py:存放 users 相关接口
  • app/internal/ :Python 子包:
    • app/internal/admin.py:内管相关接口

2.2 其他 文件

📌 dependencies.py

依赖项相关方法,验证请求体和 token ~

from fastapi import Header, HTTPException

async def get_token_header(x_token: str = Header()):
    if x_token != "fake-super-secret-token":
        raise HTTPException(status_code=400, detail="X-Token header invalid")

async def get_query_token(token: str):
    if token != "jessica":
        raise HTTPException(status_code=400, detail="No Jessica token provided")

📌 items.py

from fastapi import APIRouter, Depends, HTTPException

from ..dependencies import get_token_header

router = APIRouter(
    prefix="/items",
    tags=["items"],
    dependencies=[Depends(get_token_header)],
    responses={404: {"description": "Not found111"}},
)

fake_items_db = {"plumbus": {"name": "Plumbus"}, "gun": {"name": "Portal Gun"}}

@router.get("/")
async def read_items():
    return fake_items_db

@router.get("/{item_id}")
async def read_item(item_id: str):
    if item_id not in fake_items_db:
        raise HTTPException(status_code=404, detail="Item not found")
    return {"name": fake_items_db[item_id]["name"], "item_id": item_id}

@router.put(
    "/{item_id}",
    tags=["custom"],
    responses={403: {"description": "Operation forbidden"}},
)
async def update_item(item_id: str):
    if item_id != "plumbus":
        raise HTTPException(
            status_code=403, detail="You can only update the item: plumbus"
        )
    return {"item_id": item_id, "name": "The great Plumbus"}

📌 users.py

from fastapi import APIRouter

router = APIRouter()

@router.get("/users/", tags=["users"])
async def read_users():
    return [{"username": "Rick"}, {"username": "Morty"}]

@router.get("/users/me", tags=["users"])
async def read_user_me():
    return {"username": "fakecurrentuser"}

@router.get("/users/{username}", tags=["users"])
async def read_user(username: str):
    return {"username": username}

📌 users.py

from fastapi import APIRouter

router = APIRouter()

@router.post("/")
async def update_admin():
    return {"message": "Admin getting schwifty"}

以上接口文件均使用 APIRouter ,最后将调用给 main 文件以供汇总。

2.3 main 文件

这里你导入并使用 FastAPI 类,是应用程序中将所有内容联结在一起的主文件。 

from fastapi import Depends, FastAPI

from .dependencies import get_query_token, get_token_header
from .internal import admin
from .routers import items, users

app = FastAPI(dependencies=[Depends(get_query_token)])

app.include_router(users.router)
app.include_router(items.router)
app.include_router( #依旧可自定义参数
    admin.router,
    prefix="/admin",
    tags=["admin"],
    dependencies=[Depends(get_token_header)],
    responses={418: {"description": "I'm a teapot"}},
)

@app.get("/")
async def root():
    return {"message": "Hello Bigger Applications!"}


if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)

📌 导入模块

比如:

from .routers import items, users
  • 这表示从该模块(app/main.py 文件)所在的同一个包(app/ 目录)
  • 寻找 routers 子包(位于 app/routers/ 的目录)...
  • 从该包中,导入子模块 items (位于 app/routers/items.py 的文件) 以及 users (位于 app/routers/users.py 的文件)...

items 模块将具有一个 router 变量(items.router)。

相对导入:from .routers import items, users

绝对导入:from app.routers import items, users

📌 app.include_router

app.include_router(users.router)
app.include_router(items.router)

使用 app.include_router(),我们可以将每个 APIRouter 添加到主 FastAPI 应用程序中。 它将包含来自该路由器的所有路由作为其一部分。

官方:包含路由器时,你不必担心性能问题。 这将花费几微秒时间,并且只会在启动时发生。 因此,它不会影响性能。⚡

2.4 API 文档

启动 main 文件,访问 http://127.0.0.1:8000/docs,即可看到使用了正确路径(和前缀)和正确标签的自动化 API 文档,包括了来自所有子模块的路径:

【Python开发】FastAPI 11:构建多文件应用

由于 fastapi 内置的接口文档使用的外网的 cdn,所以可能导致页面卡死,接口文档显示空白,解决办法可参考:https://blog.csdn.net/m0_52726759/article/details/124854070。文章来源地址https://www.toymoban.com/news/detail-497742.html

到了这里,关于【Python开发】FastAPI 11:构建多文件应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MemFire教程|FastAPI+MemFire Cloud+LangChain开发ChatGPT应用-Part2

    上篇文章我们讲解了使用FastAPI+MemFire Cloud+LangChain进行GPT知识库开发的基本原理和关键路径的代码实现。目前完整的实现代码已经上传到了github,感兴趣的可以自己玩一下: https://github.com/MemFire-Cloud/memfirecloud-qa 目前代码主要完成了如下一些基本功能: 使用FastAPI作为Web服务端

    2024年02月14日
    浏览(43)
  • 【Python开发】FastAPI 10:SQL 数据库操作

    在 FastAPI 中使用 SQL 数据库可以使用多个 ORM 工具,例如 SQLAlchemy、Tortoise ORM 等,类似 Java 的 Mybatis 。这些 ORM 工具可以帮助我们方便地与关系型数据库进行交互,如 MySQL 、PostgreSQL等。本篇文章将介绍如何使用 SQLAlchemy 来完成数据库操作,以便让我们在 FastAPI 项目中方便地进

    2024年02月14日
    浏览(42)
  • python三大开发框架django、 flask 和 fastapi 对比

    本文讲述了什么启发了 FastAPI 的诞生,它与其他替代框架的对比,以及从中汲取的经验。 如果不是基于前人的成果,FastAPI 将不会存在。在 FastAPI 之前,前人已经创建了许多工具 。 几年来,我一直在避免创建新框架。首先,我尝试使用许多不同的框架,插件和工具来解决

    2024年02月10日
    浏览(60)
  • 【Python开发】FastAPI 09:middleware 中间件及跨域

    FastAPI 提供了一些中间件来增强它的功能,类似于 Spring 的切面编程,中间件可以在请求处理前或处理后执行一些操作,例如记录日志、添加请求头、鉴权等,跨域也是 FastAPI 中间件的一部分。 目录 1 中间件 1.1 创建中间件 1.2 使用中间件  2 跨域 2.1 跨域详解 2.2 使用 CORSM

    2024年02月09日
    浏览(66)
  • ChatGPT Plugin开发setup - Java(Spring Boot) Python(fastapi)

    记录一下快速模板,整体很简单,如果不接auth,只需要以下: 提供一个 /.well-known/ai-plugin.json 接口,返回openAI所需要的格式 提供openAPI规范的文档 CORS设置 其他的和普通的web开发类似. 本地开发就直接使用localhost即可,前几天官方localhost无法联通,最近应该修复了. 要让GPT更好理解接口

    2024年02月04日
    浏览(47)
  • FastAPI + NGINX + Gunicorn:一步一步教你部署一个高性能的Python网页应用

    部署一个 FastAPI 应用到你的服务器是一项复杂的任务。如果你对 NGINX 、 Gunicorn 和 Uvicorn 这些技术不熟悉,可能会浪费大量的时间。如果你是刚接触 Python 语言不久或者希望利用 Python 构建自己的Web应用程序,本文的内容可能会让你第一次部署时更节省时间。 FastAPI 是用于开发

    2024年02月05日
    浏览(65)
  • 毕业设计:Vue3+FastApi+Python+Neo4j实现主题知识图谱网页应用——前言

    资源链接:https://download.csdn.net/download/m0_46573428/87796553 前言:毕业设计:Vue3+FastApi+Python+Neo4j实现主题知识图谱网页应用——前言_人工智能技术小白修炼手册的博客-CSDN博客 首页与导航:毕业设计:Vue3+FastApi+Python+Neo4j实现主题知识图谱网页应用——前端:首页与导航栏_人工智

    2024年02月14日
    浏览(48)
  • FastAPI 构建 API 高性能的 web 框架(一)

    如果要部署一些大模型一般langchain+fastapi,或者fastchat, 先大概了解一下fastapi,本篇主要就是贴几个实际例子。 官方文档地址: https://fastapi.tiangolo.com/zh/ 来源:大语言模型工程化服务系列之五-------复旦MOSS大模型fastapi接口服务 服务端代码: api启动后,调用代码: 来源: 大语

    2024年02月13日
    浏览(47)
  • FastAPI 构建 API 高性能的 web 框架(二)

    上一篇 FastAPI 构建 API 高性能的 web 框架(一)是把LLM模型使用Fastapi的一些例子,本篇简单来看一下FastAPI的一些细节。 有中文官方文档:fastapi中文文档 假如你想将应用程序部署到生产环境,你可能要执行以下操作: 并且安装uvicorn来作为服务器: 然后对你想使用的每个可选

    2024年02月12日
    浏览(50)
  • FastAPI和Flask:构建RESTful API的比较分析

    Python 是一种功能强大的编程语言,广泛应用于 Web 开发领域。 FastAPI  和 Flask 是 Python Web 开发中最受欢迎的两个框架。本文将对 FastAPI 和 Flask 进行综合对比,探讨它们在语法和表达能力、生态系统和社区支持、性能和扩展性、开发工具和调试支持、安全性和稳定性、学习曲线

    2024年02月13日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包