在python的主流框架里面对于route路由规则的处理是相当的直接,都是使用python re正则表达式来处理 。想想这也是理所当然的,如果想要构建丰富的url匹配,那必须要用正则表达式的。 另外route路由器本身不会重新排序,他的顺序是你程序构建route规则的顺序。

该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。http://xiaorui.cc/?p=3215

简单说说,tornado、flask框架的路由添加方法。

tornado的匹配模式,这样的模式较统一,可以在一个入口管理所有的路由规则。

下面是flask的装饰器添加发挥方式,当然他也有blueprints蓝图模式。 装饰器模式适合接口不多的情况,也算是方便。仁者见仁智者见智,在路由项较少的时候,我偏向于这个用法。 


flask、torando、bottle的route代码我都看了一遍,没什么让人惊艳的地方,就是一个个的正则匹配。 我有些好奇,为什么不把这些规则构建成hash匹配,或者是树trie结构等等。 如果安装这些主流route规则的方法来说,绝对的O(1)呀.

不理解 ! 

咱们先不说性能的问题,先把route规则的要点说明白。在web框架中,路由表中的任何一个规则都包含pattern(模式)和handler(处理函数或类)。当httpserver接收到一个http请求,server从接收到的请求中解析出url path,然后顺序遍历路由表,如果发现url path可以匹配某个pattern,则将此http request交给web应用中对应的handler去处理。  

再开发路由器之前,看看tornado是如何实现route匹配,是否高雅.

下面是tornado demo. 我们创建了两个路由规则。

下面是tornado添加路由的动作.

这是上面提过的URLSpec类,可以接受pattern, handler, kwargs。

下面是tornado如何匹配路由规则的。


用过flask、bottle的人知道,他们是使用装饰器的方式来添加规则的。 抛开这两web框架自己怎么实现路由匹配。

实现原理也相当简单,把url + handler + method 扔到一个列表,当请求来的时候一个个的匹配。 

使用方法:

对于高效路由规则匹配,说实话我还没实现,没有实现的原因是不是自己写不出来,而是懒,另外我没有搞明白主流的框架为什么会使用这么低效的路由匹配规则。   先不管别人的实现,先描述下高效路由器的实现思路。

首先url根据 / 进行阶段,在路由正则里坚决不能写/字符串。 /a/b/c/search?keyword=xiaorui.cc ,  这时候我们可以把 a + b + c 做个md5,跟handler放在一个hash map里就可以了。 如果构建路由的时候,需要细粒度的method,那么可以a + b + c + method 映射handler。  这个情况比较适合于没有正则的规则。  如果有复杂的的正则模式怎么办?   首先我们的场景很少有那种从头到尾都是正则的,比如 /home\w*/add.*/article.*/page.*/scollid\w*  ,你丫吃干饭的,啥都不确定?   一般最少第一层是确定的,后面的几层不确定,那么我们使用最低深度法,如果最低层是第一层,匹配到第一层后,按照第一层的规则来熟悉的匹配。


URL样式:

构建出来的匹配结构.

END

  



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!

构建高效的python requests长连接池

前文:      最近在搞全网的CDN刷新系统,在性能调优时遇到了requests长连接的一个问题,以前关注过长连接太多造成浪费的问题,但因为系...

阅读全文

不要粗暴的销毁python线程

前言:     不要试图用强制方法杀掉一个python线程,这从服务设计上就存在不合理性。 多线程本用来任务的协作并发,如果你使用强制手段干掉线...

阅读全文

关于海量数据处理的一些话题

这两天跟朋友聊了些关于海量数据的处理问题…    咱们暂且不提那些hadoop、spark的集群解决方案,就单单说海量数据的处理方式,一般面试题...

阅读全文

发表评论