python实现web应用框架之增加动态路由

目录
  • 路由添加正则表达式有什么用?
  • 如何定义动态路由
  • 注册动态路由
  • 匹配动态路由
  • 框架运行效果展示
  • 总结

今天我们将继续对该框架进行路由添加正则表达式。

本篇文章所依赖的python环境为:

路由添加正则表达式有什么用?

在介绍之前,我们首先要介绍一下Get获取资源的时候,有如下几种传参方式:

  • 使用key...value 的形式,将参数放到url问号?后面,如: http://127.0.0.1/userInfo?name=pdudo
  • url中以路径参数的方式传递,例如: http://127.0.0.1/userInfo/pdudo/info
  • 在请求头中传递参数,请求头是以key...value的形式存储的,当然也可以自定义存放请求参数。

上述的第二种以路径参数的方式传参,就是我们这边文章所描述的点。

为什么需要这样做呢?

假设我们现在正在写一个功能,他需要返回传上来的用户信息,接口为: /userInfo/userid/infos,其中userid是动态的,所以接口可以是/userInfo/c12345/infos,也可以是/userInfo/d33456/infos等等。

如果是这种情况,我们应该怎么样样定义路由呢? 是在项目中给每个人都定义一个路由信息么?

很显然不是的,如果这个时候,注册的路由恰恰好是正则的,可以获取客户端传上来的参数,例如:/userInfo/pdudo/info,函数将会获取pdudo,这样不是很好么?

这就需要用到正则了。

如何定义动态路由

由于我们此前已经写好了定义静态路由的相关方法,所以我们在定义动态路由的时候,最好加一个识别参数,告诉框架,这个路由是静态的 还是 动态的。

由于是动态路由,所以在路由url中,有些值肯定是动态的,如何在区别于静态的值和动态的值呢? 在该框架中,我们将动态值用大括号括起来,比如: /userInfo/{userID}/infos,其中userID是动态的,可以是任何值组成,但是/userInfo/infos必须是静态的,而且先后顺序也是固定的。

所以说,我们可以约束一下,在定义动态路由的时候,需要告诉框架,我这个是动态路由,以及动态url

所以我们准备将动态路由定义规划如下:

@myWeb.routes(path="/jobs/{jobID}/startd",methods="post",regular=True)
def startJobs(r,cData):
    print("cData: " ,cData)

上述代码,是我们即将完善功能后的代码案例,其中regularTrue代表该路由是动态的,path的值为/jobs/{jobID}/startd,其中jobID也是动态的,可以被任何值代替。

最后是函数将接收2个参数,r的值代表wsgi中的environ信息。 而cData则代表从客户端上报的值,即:jobID的替代值。

注册动态路由

如上我们已经约束好了一个动态路由的添加规则,那么我们如何注册动态路由呢?

首先肯定的是,动态路由肯定不能和静态路由放在一起,所以我们定义了新的字典用于存放动态路由的信息,如:

mapGetRegularRouting = {}
mapPostRegularRouting = {}

而后则是我们需要将注册的路由信息转换为正则表达式,这里举个例子:

我们注册的路由是这样的: /jobs/{jobID}/startd,我们需要将其转换为正则表达式,正则表达式的值是这样的: ^/jobs/(.*?)/startd$

关于这段正则表达式,它的含义是 匹配以/jobs/开头和/startd结尾的字符串,并且将匹配到的信息(.*的值)存储到元组中。

注意这里.*后面的问号?代表不启用贪婪匹配,也就是最小化匹配。

现在的问题是,如何将{jobsID}给转换为(.*?)呢? 在python中,可以使用re.sub进行替换操作,我们可以使用如下语句,将{jobsID}给替换为(.*?),代码如下:

import re
print(re.sub("{.*?}","(.*?)","/jobs/{jobID}/startd"))

如上代码执行的结果为:

最后将该路由信息存储到上述定义好的字典中即可,代码片段如下:

reFindall = re.compile(r"{(.*?)}")
reSubAll = re.compile(r"{.*?}")

parameter = re.findall(reFindall,self.path)
reText = re.sub(reSubAll,"(.*?)",self.path)
reText = f"{reText}$"
regular = {
    "original": self.path,
    "reText": reText,
    "parameter": parameter,
    "func": func
}
# ...
if self.re:
    mapPostRegularRouting[regular["reText"]] = regular

至此,我们的动态路由就已经注册好了。

匹配动态路由

相比于注册动态路由,当客户端请求来了之后,匹配动态路由会很麻烦,因为没有请求报文不是告诉你,这是动态路由还是静态路由,所以说,匹配动态路由很麻烦。

我们匹配动态路由想到的时候笨办法,即: 先匹配静态路由,若静态路由匹配不到,则再匹配动态路由,若动态路由都匹配不到的话,则选用默认路由。

匹配静态路由和动态路由,前面篇章已经介绍过了,所以这里不再赘述,这里就介绍如何匹配动态路由。

所谓的动态路由规则匹配,实际上就是拿着客户端上传的url,挨个对我们已有的正则表达式做轮训,若匹配成功则退出循环,若匹配失败,最后就返回一个默认路由即可,匹配正则表达式代码如下:

for key in RegularRouting.keys():
    if re.match(key, path):
        isRegular = True
        collText = re.findall(key, path)
        func = RegularRouting[key]["func"]
        break
else:
    func = Route["/*"]

框架运行效果展示

关于myWeb.py由于很长,有100多行,不好截图,也不好纯复制代码了,所以放到了gitee上面:gitee.com/pdudo/golea…

我们简单写几个demo测试一下web框架,代码如下:

import myWeb
import wsgiref.simple_server

@myWeb.routes(path="/ip",methods="all")
def indx(r):
    print(r["REMOTE_ADDR"])
    return (200,r["REMOTE_ADDR"])

@myWeb.routes(path="/hello/{name}",methods="get",regular=True)
def helloWold(r,cData):
    name = cData[0]
    return (200,"hello %s" % (name))

def main():
    s = wsgiref.simple_server.make_server('', 8888, myWeb.application)
    s.serve_forever()

if __name__ == '__main__':
    main()

上述代码,我们首先引入了myWebwsgiref模块,前置是我们自己写的,后则是一个满足wsgi服务器框架,在代码中,我们定义了2个路由信息,一个是静态路由,一个是动态路由,其中静态路由的函数是indx,路由信息是/ip,匹配的客户端请求方法为get或者post,该方法主要返回ip地址。

动态路由的函数则是helloWold,它将匹配到以/hello/为首的路由信息,匹配客户端请求方法为get,还函数主要获取用户发送的动态值,并且以hello 等返回给客户端。

在主函数中,我们启动一个简单的wsgi服务器,入口为myWebapplication方法 。

代码运行效果如下:

我们分别使用getpost方法,请求本地/ip路由,可见都回复回来了,而后我们访问/hello/pdudo/hello/juejin,他们也分别回复了hello pdudohello juejin

总结

本篇文件介绍了将此前的web框架,路由修改为正则表达式形式,具体添加方式为: 在进行路由注册的时候,将其路由信息转换为正则表达式,而在进行路由匹配的时候,先匹配静态服务器,若静态服务器没有,再进行正则匹配,若正则匹配依然不行,则返回最后的默认页面。

以上就是python实现web应用框架之增加动态路由的详细内容,更多关于python增加动态路由的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python之——生成动态路由轨迹图的实例

    一.scapy简介与安装 scapy(http://www.secdev.org/projects/scapy/)是一个强大的交互式数据包处理程序,它能够对数据包进行伪造或解包,包括发送数据包.包嗅探.应答和反馈匹配等功能.可以用在处理网络扫描.路由跟踪.服务探测.单元测试等方面,本节主要针对scapy的路由跟踪功能,实现TCP协议方式对服务可用性的探测,比如常用的80(HTTP)与443(HTTPS)服务,并生成美观的路由线路图报表,让管理员清晰了解探测点到目标主机的服务状态.骨干路由节点所处

  • python:动态路由的Flask程序代码

    如下所示: # Copyright (c)2018, 东北大学软件学院学生 # All rightsreserved # 文件名称:a.py # 作 者:孔云 #问题描述: from flask import Flask app=Flask(__name__) @app.route('/') def index(): return '<h1>Flask Web程序开始了....<h1>' @app.route('/user/<name>') def user(name)

  • python实现一个简单的web应用框架

    目录 引言 写应用框架需要写底层服务器么? uwsgi基本使用 安装uwsgi 配置uwsgi uwsgi常用配置 uwsgi启服和停服 启动一个demo 写一个简单的web应用框架 总结 引言 本篇文章所依赖的python环境是: 如果你还没了解过什么是WSGI,建议先查询一下相关资料,或者查看上一篇文章: python|探寻WSGI Application 写应用框架需要写底层服务器么? 这个要区分2种情况,如果应用框架,你没有参考WSGI标准,那么在写应用框架之前,你就必须要定义一套属于自

  • 详细解读Python的web.py框架下的application.py模块

    本文主要分析的是web.py库的application.py这个模块中的代码.总的来说,这个模块主要实现了WSGI兼容的接口,以便应用程序能够被WSGI应用服务器调用.WSGI是Web Server Gateway Interface的缩写,具体细节可以查看WSGI的WIKI页面 接口的使用 使用web.py自带的HTTP Server 下面这个例子来自官方文档的Hello World,这个代码一般是应用入口的代码: import web urls = ("/.*", "he

  • 使用Python的web.py框架实现类似Django的ORM查询的教程

    Django中的对象查询 Django框架自带了ORM,实现了一些比较强大而且方便的查询功能,这些功能和表无关.比如下面这个例子: class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') >>> Question.objects.all() >>> Question.ob

  • 安装Python的web.py框架并从hello world开始编程

    最近有一个小的web项目,想用喜爱都python,但是想到之前接触过都django我感觉一阵不寒而栗,为什么?Django的配置太过复杂,而且小项目不太适合MVC的开发模式,所以我将目光转向了web.py这个小型web框架,并且真正让我动心都是其官方网站上都一句话:"Django lets you write web apps in Django. TurboGears lets you write web apps in TurboGears. Web.py lets you write we

  • 浅析Python的web.py框架中url的设定方法

    网页中的数据在传递的时候有GET和POST两种方式,GET是以网址的形式传参数,在web.py中有着很好的匹配,如果我们配置以下的urls urls =( '/','index', '/weixin/(.*?)','WeixinInterface' ) 先不考虑/weixin/后面的东西,现在我们来写index的类 class index: def GET(self): i = web.input(name = 'kevinkelin',age = 100) return render.inde

  • 基于iview-admin实现动态路由的示例代码

    iview-admin是一个基于vue和iview组件库实现的管理后台前端,本文基于iview-admin最新版本,实现基于权限的动态路由加载. 本文代码可参见:https://github.com/MayBeWrong/iview-admin-dynamic-router 背景: 动态路由:vue的路由,可通过new Router传入路由数组定义实现,也可以通过router.addRoutes实现.通过router.addRoutes动态传入路由定义的方式,称之为动态路由.路由数据可以全部保存

  • Python之Web框架Django项目搭建全过程

    Python之Web框架Django项目搭建全过程 IDE说明: Win7系统 Python:3.5 Django:1.10 Pymysql:0.7.10 Mysql:5.5 注:可通过pip freeze查看已安装库版本信息. Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! Django 特点 强大的数据库功能 用python的类继承,几行代码就可以拥有一个丰富,动态的数据库操作接口(API),如果需要你也能执行SQL语句. 自带的强大的后

  • Python 搭建Web站点之Web服务器与Web框架

    之前用 Django 做过一个小的站点,感觉Django太过笨重,于是就准备换一个比较轻量级的 Web 框架来玩玩.Web.py 作者已经挂掉,项目好久没有更新,所以不准备用它.而 Flask 也是一个成熟的轻量级 Web 框架,在 github 上有众多的 Star 和 Fork,文档和扩展也很丰富,值得学习. 学习一个框架最好的方式就是用框架做一个项目,在实战中理解掌握框架.这里我用 Flask 框架,使用 Mysql 数据库做了一个 论坛系统 .麻雀虽小,五脏俱全,论坛效果图如下: 论坛系

  • Python轻量级web框架bottle使用方法解析

    Bottle是一个轻量级的Web框架,此框架只由一个 bottle.py 文件构成,不依赖任何第三方模块. #!/usr/bin/env python # -*- coding:utf-8 -*- from bottle import template, Bottle app = Bottle() @app.route('/say') def index(): return "Hello World" # return template('<b>Hello {{name}}

  • Python常用Web框架Django、Flask与Tornado介绍

    web框架是什么? web开发框架是一组工具,同时也提供了非常多的资源,供软件开发人员构建和管理网站.提供web服务.编写web应用程序.它是一个抽象工具,能使开发应用程序和重复使用代码的过程变得更容易. 为什么需要web开发框架? 进行自定义软件开发时,web开发框架让整个过程变得更容易,因而开发速度更快.更高效.许多开发框架都很便宜,这也使得整个客户机的成本更小. 一个被广泛使用的框架安全性更高.这主要依赖于该框架背后的社区,在这里,用户成为长期的测试人员,并可以提供修复. 如果发现了安全漏

  • Python使用Web框架Flask开发项目

    目录 一.简介 二.安装 三.从 Hello World 开始 3.1 Hello World 3.2 修改Flask的配置 3.3 调试模式 3.4 绑定IP和端口 3.5 本节源码 四.获取 URL 参数 4.1 建立Flask项目 4.2 列出所有的url参数 4.3 获取某个指定的参数 4.4 如何处理多值 4.5 本节源码 五.获取POST方法传送的数据 5.1 建立Flask项目 5.2 查看POST数据内容 5.3 解析POST数据 5.4 本节源码 六.处理和响应JSON数据 6

随机推荐