广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python route 知识总结
  • 108
分享到

python route 知识总结

知识pythonroute 2023-01-31 02:01:51 108人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

route 可以从url提取相应的参数,如controller,action或者其它用户自己定义的变量 1.Mapper().connect    Mapper().match [python] view plaincopy

route 可以从url提取相应的参数,如controller,action或者其它用户自己定义的变量


1.Mapper().connect    Mapper().match

[python] view plaincopy在CODE上查看代码片派生到我的代码片
  1. from routes import Mapper  
  2. map = Mapper()  
  3. map.connect(None,"error/{action}/{id}",controller="controller_obj") #定义匹配规则  
  4. result = map.match('error/myapp/4')  #匹配url='error/myapp/4'  
  5. #result 匹配结果  
  6. {'action': u'myapp', 'controller': u'controller_obj', 'id': u'4'}  
  7. map.connect(None,"/message/:name",controller='my_contro')  #除 {} 外,:也可以作为匹配符号  
  8. result = map.match('/message/12')  
  9. #result 匹配结果  
  10. {'controller': u'my_contro', 'name': u'12'}  


2.route.middleware以及Mapper.resource

参照cinder 2013.1版代码写的

[python] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #!/usr/bin/env/python  
  2. #coding=utf-8  
  3. from routes import Mapper  
  4. from routes import middleware  
  5. import WEBob.dec  
  6. from wsgiref.simple_server import make_server  
  7.   
  8. class controller(object):  
  9.     def __init__(self):  
  10.         self.i = 1  
  11.     def __call__(self):  
  12.         print self.i  
  13.     def search(self):  
  14.         return "do search()"  
  15.     def show(self):  
  16.         return "do show()"  
  17.     def index(self):  
  18.         return "do index()"  
  19.     def update(self):  
  20.         return "do update()"  
  21.     def delete(self):  
  22.         return "do delete()"  
  23.     def create(self):  
  24.         return "do create()"  
  25.     def create_many(self):  
  26.         return "do create_many()"  
  27.     def update_many(self):  
  28.         return "do update_many()"  
  29.     def list_many(self):  
  30.         return "do list_many()"  
  31.     def delete_many(self):  
  32.         return "do delete_many()"  
  33. class appclass(object):  
  34.   
  35.     def __init__(self):  
  36.         a = controller()  
  37.         map = Mapper()  
  38.         """路由匹配条件1"""  
  39.         #map.connect('/images',controller=a,  
  40.         #           action='search',  
  41.         #           conditions={'method':['GET']})  
  42.         """路由匹配条件2"""  
  43.         #map.connect('name',"/{action}/{pid}",controller=a)  
  44.         """路由匹配条件3"""  
  45.         #map.resource("message","messages",controller=a,collection={'search':'GET'})  
  46.         """路由匹配条件4"""  
  47.         #map.resource('message', 'messages',controller=a,  
  48.                         #collection={'list_many':'GET','create_many':'POST'},  
  49.                         #member={'update_many':'POST','delete_many':'POST'})  
  50.         """路由匹配条件5"""  
  51.         map.resource('message', 'messages',controller=a,path_prefix='/{projectid}',  
  52.                     collection={'list_many':'GET','create_many':'POST'},  
  53.                     member={'update_many':'POST','delete_many':'POST'})  
  54.         self.route = middleware.RoutesMiddleware(self.dispatch,map)  
  55.  
  56.     @webob.dec.wsgify  
  57.     def __call__(self,req):  
  58.         return self.route  
  59.  
  60.     @staticmethod  
  61.     @webob.dec.wsgify  
  62.     def dispatch(req):  
  63.         match = req.environ['wsgiorg.routing_args'][1]  
  64.         print "route match result is:",match  
  65.         if not match:  
  66.             return "fake url"  
  67.   
  68.         controller = match['controller']  
  69.         action = match['action']  
  70.         if hasattr(controller,action):  
  71.             func = getattr(controller,action)  
  72.             ret = func()  
  73.             return ret  
  74.         else:  
  75.             return "has no action:%s" %action  
  76.   
  77.   
  78. if __name__=="__main__":  
  79.     app = appclass()  
  80.     server = make_server('',8088,app)  
  81.     server.serve_forever()  


分析:

1)webob.dec.wsgify是webob为WSGI应用程序提供的一个装饰器,作用是将一个函数转换成一个WSGI应用。
参考资料 Http://tumblr.wachang.net/post/38149417931/Python-paste-webob-3

2)routes.middleware.RoutesMiddleware,将接受到的url,自动调用map.match()方法,将url进行路由匹配并将结果存入request请求的环境变量['wsgiorg.routing_args'],最后会调用其第一个参数给出的函数接口,即self.dispatch。

参考资料   http://blog.csdn.net/netwORM3/article/details/8666150

3)map.connect 及map.resource均用来建立路由匹配条件

针对程序中的匹配条件1  

map.connect('/images',controller=a,action='search',conditions={'method':['GET']})

curl 路由匹配结果 (程序中的route match result is) curl请求得到的结果
curl -X GET http://localhost:8088/images {'action': u'search', 'controller': <__main__.controller object at 0x10c2b10>} "do search()"

匹配条件指定了curl的动作为GET ,访问路径为images  对应的action 为search


匹配条件2 

map.connect('name',"/{action}/{pid}",controller=a)

curl 路由匹配结果 (程序中的route match result is) curl请求得到的结果
curl -X GET  http://localhost:8088/show/hihi {'action': u'show', 'controller': <__main__.controller object at 0x2203b10>, 'pid': u'hihi'} "do show()"
curl -X POST  http://localhost:8088/failfunc/test {'action': u'failfunc', 'controller': <__main__.controller object at 0x2203b10>, 'pid': u'test'} "has no action:failfunc"
匹配条件没有指定curl的动作,因此所有的动作(PUT,POST,GET,。。)都匹配,第二个curl请求,匹配的action 为failfunc,pid为test,但是程序没有定义failfunc函数,报错


匹配条件3   

map.resource("message","messages",controller=a)  ,map.resource内部定义了默认的匹配条件
第一个参数message为 member_name(资源名),第二个参数messages为collection_name(资源集合名),一般定义资源集合名为资源名的复数,我这里随便取名

collection_name作为访问的路径名,且当没有传入参数controller时,controller=collection_name


map.resource("message","messages",controller=a) 等同于以下匹配条件:

map.connect('/messages',controller=a,action='index',conditions={'method':['GET']})

map.connect('/messages',controller=a,action='create',conditions={'method':['POST']})

map.connect('/messages/{id}',controller=a,action='show',conditions={'method':['GET']})

map.connect('/messages/{id}',controller=a,action='update',conditions={'method':['PUT']})

map.connect('/messages/{id}',controller=a,action='delete',conditions={'method':['DELETE']})

前两条是针对整个资源集合的操作,后三条是针对资源集合中某个固定资源的操作


curl 路由匹配结果 (程序中的route match result is) curl请求得到的结果
curl -X POST http://localhost:8088/messages {'action': u'create', 'controller': <__main__.controller object at 0x1dbbb10>} "do create()"
curl -X GET  http://localhost:8088/messages {'action': u'index', 'controller': <__main__.controller object at 0x1dbbb10>} "do index()"
curl -X GET  http://localhost:8088/messages/12 {'action': u'show', 'controller': <__main__.controller object at 0x1dbbb10>, 'id': u'12'} "do show()"
curl -X PUT  http://localhost:8088/messages/12 {'action': u'update', 'controller': <__main__.controller object at 0x1dbbb10>, 'id': u'12'} "do update()"
curl -X DELETE  http://localhost:8088/messages/12 {'action': u'delete', 'controller': <__main__.controller object at 0x1dbbb10>, 'id': u'12'} "do delete()"
这里匹配结果中的id为某个具体资源id,这里乱取,后三条curl针对具体资源(id为12)的操作,前两条是针对整个资源集合的操作

当url传入的id包含'.',会将'.'后的字符窜匹配为format,如输入的id 为 '12.hihi' ,匹配id='12', format='hihi'


匹配条件4

map.resource('message', 'messages',controller=a,
                        collection={'search':'GET','create_many':'POST'},
                        member={'update_many':'POST','delete_many':'POST'})

map.resource除了默认的路由条件外,还可以额外的定义‘资源集合的方法’以及‘单个资源的方法’

collection={'search':'GET','create_many':'POST'}       定义了资源集合方法 search,其curl动作为GET,create_many,其curl动作为POST

member={'update_many':'POST','delete_many':'POST'}    定义了单个资源方法 update_many,其curl动作为POST,delete_many,其curl动作为POST

curl 路由匹配结果 (程序中的route match result is) curl请求得到的结果
curl -X GET  http://localhost:8088/messages/search {'action': u'search', 'controller': <__main__.controller object at 0x253Db10>} do search()
curl -X POST  http://localhost:8088/messages/create_many {'action': u'create_many', 'controller': <__main__.controller object at 0x253db10>} do create_many()
curl -X POST  http://localhost:8088/messages/1/update_many {'action': u'update_many', 'controller': <__main__.controller object at 0x253db10>, 'id': u'1'} do update_many()
curl -X POST  http://localhost:8088/messages/1/delete_many {'action': u'delete_many', 'controller': <__main__.controller object at 0x253db10>, 'id': u'1'} do delete_many()

匹配条件5 

map.resource('message', 'messages',controller=a,path_prefix='/{projectid}',
                    collection={'list_many':'GET','create_many':'POST'},
                    member={'update_many':'POST','delete_many':'POST'})

map.resource初始化时还可以指定curl访问路径的前缀路径,如匹配条件3及4没有指定时,默认为collection_name(资源集合名)

指定path_prefix后,路径为path_prefix/collection_name

curl 路由匹配结果 (程序中的route match result is) curl请求得到的结果
curl -X POST  http://localhost:8088/proj1/messages {'action': u'create', 'projectid': u'proj1', 'controller': <__main__.controller object at 0x1375b10>} do create()
curl -X GET  http://localhost:8088/proj1/messages/list_many {'action': u'list_many', 'projectid': u'proj1', 'controller': <__main__.controller object at 0x1375b10>} do list_many()
curl -X POST  http://localhost:8088/proj1/messages/member_3/update_many {'action': u'update_many', 'projectid': u'proj1', 'controller': <__main__.controller object at 0x1375b10>, 'id': u'member_3'} do update_many()


在路由5的条件下,添加一条

map.resource('type', 'types',controller=other_controller,

                           parent_resource=dict(member_name='message',

                                                                    collection_name='messages'),

                           path_prefix = '{projectid}/%s/:%s_id' %('nex','nexs'))


curl -X POST  http://localhost:8088/proj1/nex/17/types

匹配nexs_id 为17,controller 为other_controller,  parent_resource的作用为形成name_prefix = 'message_',具体作用不详,有待研究


参考资料:http://routes.readthedocs.org/en/latest/restful.html


疑问:

resource中的controller对象的类定义必须要有__call__,要不然,匹配后变为type(controller)为unicode,原因不明,有待研究


--结束END--

本文标题: python route 知识总结

本文链接: https://www.lsjlt.com/news/186651.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python route 知识总结
    route 可以从url提取相应的参数,如controller,action或者其它用户自己定义的变量 1.Mapper().connect    Mapper().match [python] view plaincopy...
    99+
    2023-01-31
    知识 python route
  • Python知识点总结
    本篇内容介绍了“Python知识点总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 为什么要使用描述符?假想你正在给学校写一个成绩管理...
    99+
    2023-06-16
  • python基础知识总结
    ...
    99+
    2023-01-31
    基础知识 python
  • Python基础知识点总结
       学了一年多的Python,去年做了一段时间的爬虫项目,近来在做数据分析和机器学习的东西,抽空整理一下以前学的Python基础知识点,有借鉴与总结。具体知识点后续会分段展开深入。     1.到底什么是Python?你可以在回答中与...
    99+
    2023-01-31
    知识点 基础 Python
  • python框架flask知识总结
    目录一、Flask蓝图目录二、Flask-SQLAlchemy2.1 加入Flask-SQLAlchemy第三方组件2.2 在app目录下建立models.py(ORM模型文件)2.3 登录视图函数2.4 登陆页面三...
    99+
    2022-06-02
    python flask python框架
  • Python基本知识点总结
    Python注释 python中单行注释采用 # 开头。 python 中多行注释使用三个单引号(''')或三个双引号(""")...
    99+
    2022-11-10
  • redis知识总结
    redis7中数据结构:字符串,hash,集合,列表,有序集合,地理位置GEO,hyperloglog 字符串最简单和memcache类似的key-value存储内部数据结构...
    99+
    2022-10-18
  • Python入门基础知识总结
    目录 一:简介: 二:Python基础语法 2.1.字面量 2.2.注释 2.3.数据类型转换 2.4.标识符 2.5.运算符 2.6.字符串 2.6.1.字符串的三种定义方式 2.6.2.字符串拼接 2.6.3.字符串格式化 2.6.4....
    99+
    2023-09-01
    python 开发语言
  • MongoDB知识点总结
    一:MongoDB 概述    一、NoSQL 简介        1. 概念:NoSQL(Not Only SQL的缩写),指的是非关系型数据库,是对不同于传统的关系型数据库的数据库管理系统的统称。用于超大规模数据的存储,数据存...
    99+
    2019-04-03
    MongoDB知识点总结
  • MySQL知识点总结
    MySQL知识点总结 一、      MySQL常用命令 启动MySQL服务:service mysqld start 或 systemctl start mysqld.service 停止MySQL服务:service mys...
    99+
    2019-07-01
    MySQL知识点总结
  • python 基础知识点归纳总结
    目录 1. python 基础知识点归纳总结1.1. 变量1.2. 数据类型1.3. 控制流语句1.3.1. if 语句1.3.2. for 循环1.3.3. while 循环 1.4....
    99+
    2023-10-20
    python 开发语言
  • 蓝桥杯python知识总结(详细)
    文章目录 python接收数据的方法python内置方法python字符串方法python模块动态规划回溯算法力扣简单题中所含知识点(前面数字为题号)力扣一些有意思的题目 python...
    99+
    2023-09-11
    python 蓝桥杯 算法
  • Python特征降维知识点总结
    说明 PCA是最经典、最实用的降维技术,尤其在辅助图形识别中表现突出。 用来减少数据集的维度,同时保持数据集中对方差贡献最大的特征。 保持低阶主成分,而忽略高阶成分,低阶成分往往能保留数据的最重要部分。 实例 f...
    99+
    2022-06-02
    Python 特征降维
  • python模型集成知识点总结
    说明 模型集成是指将一系列不同模型的预测结果集成在一起,从而获得更好的预测结果。 对于模型集成来说,模型的多样性非常重要。Diversityisstrength.用于集成的模型应尽可能好,同时应尽可能不同。 同一的网...
    99+
    2022-06-02
    python 模型 集成
  • Python中的反射知识点总结
    通过字符串映射或修改程序运行时的状态、属性、方法, 可以通过下面这4中方法 ''' 使用getattr(object, name_str, default=None) 方...
    99+
    2022-11-12
  • 35个高级Python知识点总结
    No.1 一切皆对象 众所周知,Java中强调“一切皆对象”,但是Python中的面向对象比Java更加彻底,因为Python中的类(class)也是对象,函数(function)也是对象,而且Python的代码和模块也都是对象。 Pyt...
    99+
    2023-01-31
    知识点 高级 Python
  • 总结Python变量的相关知识
    一、变量的定义 程序中,数据都是临时存储在内存中,为了更快速的查找或使用这个数据,通常我们把这个数据在内存中存储之后,给整个数据定义一个名称,这个名称就是变量。 变量就是在存储数据...
    99+
    2022-11-12
  • Python中字典的知识点总结
    这篇文章主要讲解了“Python中字典的知识点总结”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中字典的知识点总结”吧!一、概述字典的每个键值(key=>value)对用冒...
    99+
    2023-06-02
  • 总结DOM的知识点
    这篇文章主要介绍“总结DOM的知识点”,在日常操作中,相信很多人在总结DOM的知识点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”总结DOM的知识点”的疑惑有所帮助!接下来,...
    99+
    2022-10-19
  • 总结CSS基础知识
    本篇内容主要讲解“总结CSS基础知识”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“总结CSS基础知识”吧!一、CSS简介css:层叠样式表 英文全名:casca...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作