Python Web开发 教你如何解放路由管理_pythonweb什么负责路由管理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2. 解决方案

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

2.1 制定规则

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

  1. 代码目录结构,列一下简单的项目文件目录,下面以flask框架为例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

app.py是启动文件。 resources是API接口代码文件夹。 services是为API接口服务的函数封装文件夹。 如果项目还有依赖文件,也可以单独再建其他文件夹。

  1. 项目的API接口代码均放在resources文件夹下,且此文件夹只能写接口API服务代码。
  2. 接口名称命名以_连接单词,而对应文件里的类名文件名称的单词,不过换成是驼峰写法。
  3. 类的导入则通过文件名对应到类名,实现自动映射注册到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. 路由入口文件会自动映射,映射规则为: 前缀 / 项目文件夹[…] / 文件名

其中 前缀为整个项目的路由前缀,可以定义,也可以不定义,比如api-ab项目,可以定义整个项目的路由前缀为 ab/ resource下面项目文件夹如果有,则会自动拼接,如果没有,则不会读取。 举例: 前缀为空,上图resources中的三个接口对应的路由为:

hello_world.py ==>  /hello_world
ab/hello_world_python.py ==> /ab/hello_world_python
ab/testab/hello_world_python.py ==> /ab/testab/hello_world_python


前缀为ab/,上图resources中的三个接口对应的路由为:

hello_world.py ==> ab/hello_world
ab/hello_world_python.py ==> ab/ab/hello_world_python
ab/testab/hello_world_python.py ==> ab/ab/testab/hello_world_python
复制代码

  1. 关于resources里目录结构,代码里是可以允许N层,但建议不要超过3层, 不易管理。

2.2 代码实现

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

完整代码地址: github.com/CrystalSkyZ…

  1. 实现下划线命名 转 驼峰命名 函数,代码演示:
def underline_to_hump(underline_str):
'''
下划线形式字符串转成驼峰形式,首字母大写
'''
sub = re.sub(r'(_\w)', lambda x: x.group(1)[1].upper(), underline_str)
if len(sub) > 1:
    return sub[0].upper() + sub[1:]
return sub


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

    • 通过python内置函数__import__函数实现加载类
#更多Python视频、源码、资料加群683380553免费获取
def import_object(name):
"""Imports an object by name.
import_object('x') is equivalent to 'import x'.
import_object('x.y.z') is equivalent to 'from x.y import z'.
"""
if not isinstance(name, str):
    name = name.encode('utf-8')
if name.count('.') == 0:
    return __import__(name, None, None)

parts = name.split('.')
obj = __import__('.'.join(parts[:-1]), None, None, [parts[-1]], 0)
try:
    return getattr(obj, parts[-1])
except AttributeError:
    raise ImportError("No module named %s" % parts[-1])
复制代码

* 通过importlib模块实现
importlib.import_module(name)
复制代码

上面2种方法都可以,github上代码里2种方法都有测试。
3. 检索resources文件夹,生成路由映射,并导入对应实现类, 代码演示如下:

def route(route_file_path,
      resources_name="resources",
      route_prefix="",
      existing_route=None):
      
route_list = []

    def get_route_tuple(file_name, route_pre, resource_module_name):
        """
        :param file_name: API file name
        :param route_pre: route prefix
        :param resource_module_name: resource module
        """
        nonlocal route_list
        nonlocal existing_route
        route_endpoint = file_name.split(".py")[0]
        #module = importlib.import_module('{}.{}'.format(
        #    resource_module_name, route_endpoint))
        module = import_object('{}.{}'.format(
            resource_module_name, route_endpoint))
        route_class = underline_to_hump(route_endpoint)
        real_route_endpoint = r'/{}{}'.format(route_pre, route_endpoint)
        if existing_route and isinstance(existing_route, dict):
            if real_route_endpoint in existing_route:
                real_route_endpoint = existing_route[real_route_endpoint]
        route_list.append((real_route_endpoint, getattr(module, route_class)))

    def check_file_right(file_name):
        if file_name.startswith("_"):
文末有福利领取哦~
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

👉**一、Python所有方向的学习路线**

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。![img](https://img-blog.csdnimg.cn/c67c0f87cf9343879a1278dfb067f802.png)

👉**二、Python必备开发工具**

![img](https://img-blog.csdnimg.cn/757ca3f717df4825b7d90a11cad93bc7.png)  
👉**三、Python视频合集**

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。  
![img](https://img-blog.csdnimg.cn/31066dd7f1d245159f21623d9efafa68.png)

👉 **四、实战案例**

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。**(文末领读者福利)**  
![img](https://img-blog.csdnimg.cn/e78afb3dcb8e4da3bae5b6ffb9c07ec7.png)

👉**五、Python练习题**

检查学习结果。  
![img](https://img-blog.csdnimg.cn/280da06969e54cf180f4904270636b8e.png)

👉**六、面试资料**

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。  
![img](https://img-blog.csdnimg.cn/a9d7c35e6919437a988883d84dcc5e58.png)

![img](https://img-blog.csdnimg.cn/5db8141418d544d3a8e9da4805b1a3f9.png)

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值