22.FastAPI开发大型应用

在前面的代码示例中,我们都是在一个文件创建路由;在实际开发中,一般会根据需求进行模块划分,代码项目中也会根据模块进行开发,不同的模块采用不同的文件来编写程序。在FastAPI中提供了APIRouter来组织路由, 相当于Flask中的 Blueprints。

22.1 使用APIRouter创建路由

1.导入 APIRouter

 from fastapi import APIRouter 

2.使用 APIRouter 定义路由操作

 router = APIRouter() 

使用 @router.get等对路由方法进行修饰即可,使用方式与FastAPI类相同。

22.2 FastAPI 主体程序

在FastAPI主体程序中,将具有 APIRouter 的子模块导入,然后通过FastAPI类的 include_router 将路由添加到应用程序。代码示例如下:

目录结构:

main.py
test__init__.pytest.py
demo__init__.pydemo.py

上面的目录结构中,test与demo是Python包。

test.py

# coding: utf-8
from fastapi import APIRouter
​
router = APIRouter()
​
@router.get(path='/hello1')
async def hello1():return {'hello1': 'Hello APIRouter1'}

demo.py

# coding: utf-8
from fastapi import APIRouter
​
router = APIRouter()
​
@router.get(path='/hello2')
async def hello1():return {'hello2': 'Hello APIRouter2'}

main.py

# coding: utf-8
from fastapi import FastAPI
from test import test
from demo import demo
​
app = FastAPI()
app.include_router(test.router)
app.include_router(demo.router)
​
@app.get(path='/')
async def root():return "Hello world"

启动应用,然后进行请求测试:

curl http://127.0.0.1:8000
"Hello world"
curl http://127.0.0.1:8000/hello1
{"hello1":"Hello APIRouter1"}
curl http://127.0.0.1:8000/hello2
{"hello2":"Hello APIRouter2"}

22.3 APIRouter 的参数

在实际开发中,一个文件中的路由是有相同的部分的,比如:“/test/hello1”、“/test/hello2”中,“/test”是相同的路由路径,在FastAPI中,可以通过APIRouter的参数来添加路由的前缀,而不需要在每个路由定义的时候分别去添加。APIRouter的参数:

  • prefix 路由前缀

  • tags 标签

  • dependencies 依赖项

  • responses 额外的响应

除此之外,我们有时候在不同的文件中还需要相同的路由前缀,所以,APIRouter 最好在包的初始化文件__init__.py中声明和定义。下面将上面的代码修改如下:

demo\__init__.py

# coding: utf-8
from fastapi import APIRouter
​
router = APIRouter(prefix='/demo')
import demo.demo

demo.py

# coding: utf-8
from demo import router
​
@router.get(path='/hello2')
async def hello1():return {'hello2': 'Hello APIRouter2'}

test\__init__.py

# coding: utf-8
from fastapi import APIRouter
​
router = APIRouter(prefix='/test')
import test.test

test.py

# coding: utf-8
from test import router
​
@router.get(path='/hello1')
async def hello1():return {'hello1': 'Hello APIRouter1'}

main.py

# coding: utf-8
from fastapi import FastAPI
import test
import demo
​
app = FastAPI()
app.include_router(test.router)
app.include_router(demo.router)
​
@app.get(path='/')
async def root():return "Hello world"

从以上代码中可以看出,对应定义的路由:

curl http://127.0.0.1:8000/demo/hello2
curl http://127.0.0.1:8000/test/hello1

运行测试:

curl http://127.0.0.1:8000/test/hello1
{"hello1":"Hello APIRouter1"}
curl http://127.0.0.1:8000/demo/hello2
{"hello2":"Hello APIRouter2"}

需要注意:在包的初始化文件__init__.py文件中,一定要对使用了router的python文件进行import,并且import指令要放到router声明的后面,以便将使用了router的python文件编译进来。

22.4包含路由

在FastAPI中,也可以使用FastAPI类的include_router函数的相应参数进行路由前缀的设置,当然也可以设置其他参数,这样就不必在APIRouter声明中设置参数。如将上面的代码中修改如下:

__init__.py中的代码修改为:

from fastapi import APIRouter
router = APIRouter()

main.py

# coding: utf-8
from fastapi import FastAPI
import test
import demo
​
app = FastAPI()
app.include_router(test.router, prefix='/test')
app.include_router(demo.router, prefix='/demo')
​
@app.get(path='/')
async def root():return "Hello world"

运行结果与上面的代码是相同的。

22.5多次使用不同的 prefix 包含同一个路由器

在FastAPI中,也可以在同一路由上使用不同的前缀来多次使用 .include_router();这样做在有些场景下可能有用,例如以不同的前缀公开同一个的 API,比方说 /api/v1 和 /api/latest;这是一个可能并不真正需要的高级用法,但万一你有需要了就能够用上。

如:在上面的main.py中增加一行:

app.include_router(demo.router, prefix='/demo2')

这样,我们在请求curl http://127.0.0.1:8000/demo2/hello2也会返回与curl http://127.0.0.1:8000/demo/hello2相同的结果。

22.6在另一个 APIRouter 中包含一个 APIRouter

与在 FastAPI 应用程序中包含 APIRouter 的方式相同,也可以在另一个 APIRouter 中包含 APIRouter。

如:上面的代码中,我们在test\__init__.py中增加一行:

router.include_router(demo.router)

这样,就可以请求:curl http://127.0.0.1:8000/test/hello2,返回结果:

{"hello2":"Hello APIRouter2"}

本篇主要讲述了FastAPI的APIRouter的使用方法,主要以其prefix参数以及include_router函数的prefix参数的使用来说明如何组织路由,通过组织路由来完成大型项目的开发,以便我们可以在多个文件中组织和管理软件的代码。

22.FastAPI开发大型应用相关推荐

  1. 远程过程调用失败_Java开发大型互联网RPC远程调用服务实现之问题处理方案

    引言 RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议 ...

  2. php商城项目开发视频_ThinkPHP框架开发大型商城项目实战视频教程下载

    ThinkPHP框架开发大型商城项目实战视频教程下载 教程介绍:ThinkPHP 为了简化企业级应用开发和敏捷WEB应用开发而诞生的一个免费开源的,快速.简单的面向对象的国产轻量级PHP开发框架.框架 ...

  3. php负载均衡原理_Java开发大型互联网架构深入负载均衡原理之方案分析

    引言 负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性. 负载均衡,英文名称为Load Balan ...

  4. 使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?(非常稳定、捕获所有异常、非常适合从头开始,但大公司已经有现成的C++框架、所以不会使用)

    使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?(非常稳定.捕获所有异常.非常适合从头开始,但大公司已经有现成的C++框架.所以不会使用) 参考文章: (1)使用 Go 语言开发大型 MMO ...

  5. 用python开发的网站多吗-django可以开发大型网站吗

    Django是可以开发大型网站的,国内的豆瓣就是典型Python+Django开发的. Django工作机制 1.用manage .py runserver 启动Django服务器时就载入了在同一目录 ...

  6. 【译】开发大型 Angular 应用的12条架构清单

    原文链接:12 Things to Help Large Organizations Do Angular Right 在 Nrwl,我们帮助财富500强公司用正确的方式使用 Angular 平台开发 ...

  7. php面向对象项目,PHP的面向对象编程:开发大型PHP项目的方法(一)

    PHP(PHP培训 php教程 )的面向对象编程:开发大型PHP项目的方法(一) 作者:Luis Argerich 译者:limodou 这篇文章介绍了在PHP中的面向对象编程(OOP,Object ...

  8. 干货:使用Fastapi开发自己的Mock server(附源码)

    最近几天抽空看了下Fastapi的文档,顺便使用它开发了个HTTP(s)协议的Mock server.以后有需要用到挡板的地方,就可以直接使用啦. 项目一级目录: logs用来存放日志文件,日切 ma ...

  9. php可以开发大型网站吗?其实这个问题不用回答

    PHP完全可以开发大型网站,像facebook目前还有一半以上代码是php,不过确实借助了HHVM技术编译PHP为字节码,总之大型网站就是微服务架构的比较多,有些模块用php,有些模块用c++,go, ...

最新文章

  1. 初级管理者,如何打通任督二脉
  2. linux怎么取消文件隐藏命令,Linux基础命令:显示隐藏的文件
  3. JDBC 创建连接对象的三种方式 、 properties文件的建立、编辑和信息获取
  4. ANN:ML方法与概率图模型
  5. android 生命周期管理,Android Activity生命周期和堆栈管理的详解_Android_脚本之家...
  6. 计算机应用基础作业2客观题,《计算机应用基础》作业2.doc
  7. c++ 迭代器++和+1_C ++中的迭代器简介
  8. 纯前端控件集 WijmoJS 2018V2发布,提供可视化设计器,在React、Vue和Angular中的更易用...
  9. 第二个网站成长经历,http://www.chaomagou.com/ 潮妈购
  10. +搭建“记忆宫殿”的三款思维导图神器
  11. 如何用python写一个答题程序_python练习题库
  12. oracle创建哈希索引,ORACLE10g新特性——全局HASH分区索引
  13. java素数判断1到100_Java 求1-100以内的所有素数,判断一个数是不是素数
  14. linux安装网易云
  15. 儿童成长曲线 (WHO标准)
  16. k8s生命周期---容器探测
  17. 夜光:Java成神之路(九)擅长的语言
  18. 3999美元掀价格战,Velodyne宣布16线激光雷达降价50%
  19. 共享服务器模式(shared server)和专用服务器模式(dedicated server)
  20. 找个程序员做老公,最靠谱!

热门文章

  1. 微信语音识别和语义理解接口
  2. 用Diskedit修复分区表(图解教程)
  3. 运行时间监控:如何确保网络设备运行时间
  4. [连载]Java程序设计(01)---任务驱动方式:英制单位转换成公制单位
  5. Android实现一个简易的新闻列表APP(TabLayout+ViewPager+Fragment)
  6. JavaVector类
  7. 苏州大学实验报告模板C语言,苏州大学实验报告-Flash在线编程实验.doc
  8. 五分钟带你玩转SpringSecurity(四)配置全解析,带你掌握security核心要点
  9. ARMV8对CPU虚拟化的支持及L4_fiasco中实现
  10. 奇怪的朋友圈(并查集)