python 多文件编译 python 多个文件_API


python 多文件编译 python 多个文件_python_02

如何解放路由管理

1. 痛点

随着业务的飞速发展,API接口越来越多,路由管理文件从几十号变成几百上千行,且每次上新服务,需要在修改路由文件代码,带来一定的风险。

2. 解决方案

  • 既然路由文件随着业务的扩展越来越庞大,那就去掉路由文件。
  • 制定对应规则,路由通过API文件名根据一定的规则对应类名,然后自动导入对应实现类,注册到Web框架中。

2.1 制定规则

下面这套规则只是其中一种方案,可以针对项目情况制定对应的规则,然后实现相关代码,但是整体思路基本一样。

  1. 代码目录结构,列一下简单的项目文件目录,下面以flask框架为例:
  2. app.py是启动文件。
  3. resources是API接口代码文件夹。
  4. services是为API接口服务的函数封装文件夹。
  5. 如果项目还有依赖文件,也可以单独再建其他文件夹。
  6. 项目的API接口代码均放在resources文件夹下,且此文件夹只能写接口API服务代码。
  7. 接口名称命名以_连接单词,而对应文件里的类名文件名称的单词,不过换成是驼峰写法。
  8. 类的导入则通过文件名对应到类名,实现自动映射注册到web框架中。

规则举例如下:

如上图,resources下有一个hello_world接口,还有一个ab项目文件夹,ab下面还有一个hello_world_python接口以及子项目文件夹testab,testab下面也有一个hello_world_python.

  • 接口文件的文件名命名规范:
  • 文件名命名均为小写,多个单词之间使用'_'隔开,比如hello_world.py 命名正确,helloWorld.py命名错误。
  • 接口文件里的接口类Class命名是以文件名字转为驼峰格式,且首字母大写。比如hello_world.py 对应的接口类是 HelloWorld
  • 举例: hello_world.py
  • hello_world_python.py
  1. 路由入口文件会自动映射,映射规则为:
  2. 前缀 / 项目文件夹[...] / 文件名
  3. 其中 前缀为整个项目的路由前缀,可以定义,也可以不定义,比如api-ab项目,可以定义整个项目的路由前缀为 ab/
  4. resource下面项目文件夹如果有,则会自动拼接,如果没有,则不会读取。
  5. 举例:
  6. 前缀为空,上图resources中的三个接口对应的路由为:

python 多文件编译 python 多个文件_API_03

2.2 代码实现

python很多框架的启动和路由管理都很类似,所以这套规则适合很多框架,测试过程中有包括flask, tornado, sanic, japronto。 以前年代久远的web.py也是支持的。

完整代码地址:

https://github.com/CrystalSkyZ/PyAutoApiRoute

2.2.1 实现下划线命名 转 驼峰命名 函数,代码演示:

python 多文件编译 python 多个文件_python_04

2.2.2 实现根据字符串导入模块函数, 代码演示:

python 多文件编译 python 多个文件_文件名_05

2.2.3 检索resources文件夹,生成路由映射,并导入对应实现类, 代码演示如下:

python 多文件编译 python 多个文件_python 多文件编译_06

  • et_route_tuple函数作用是通过字符串导入类,并将路由和类以元组的方式添加到数组中。
  • check_file_right函数作用是过滤文件夹中不合法的文件。
  • recursive_find_route函数采用递归查找resources中的文件。
  • existing_route参数是将已经线上存在的路由替换新规则生成的路由,这样旧项目也是可以优化使用这套规则。

3. 应用到项目中

以flask框架为例,其余框架请看github中的代码演示。

app.py 中代码

python 多文件编译 python 多个文件_python 多文件编译_07

总结: 至此,通过制定一定规则,解放路由管理文件方案完成。 欢迎各位一起讨论其余比较好的方案。