首页 > programming, python > python Route 简单使用笔记

python Route 简单使用笔记

Routes is a Python re-implementation of the Rails routes system for mapping URLs to application actions, and conversely to generate URLs. Routes makes it easy to create pretty and concise URLs that are RESTful with little effort.

Routes 其实就是 Python 版本的 Rails 的 routes. 它用来将用户的不同 URLs 自动匹配 到不同的应用上, 对于开发 RESTful 的 API 和其他 web 的应用非常方便.

例如下面根据官网上的例子修改的, 简单明了:

>>> from routes import Mapper
>>> map = Mapper()
>>> map.connect(None, "/error/{action}/{id}", controller="error")
>>> map.connect("home", "/", controller="main", action="index")
>>> print map
Route name Methods Path                
                   /error/{action}/{id}
home               /                   
>>> print map.match('/error/myapp/4')
{'action': u'myapp', 'controller': u'error', 'id': u'4'}
>>> print map.match('/')
{'action': u'index', 'controller': u'main'}

简单来讲, routes 的使用有以下简单的几步:

  1. 创建一个用来响应用户请求的控制器 C
  2. 创建一个 Mapper m
  3. 用 m.connect(或者 resource) 连接需要解析的 URLs 到 Controller 上
  4. 使用 routes.middleware.RoutesMiddleware 自动化 URLs 到 Controller 的处理

下面是一个例子

import webob.dec
import eventlet
from eventlet import wsgi, listen
from routes import Mapper, middleware
 
 
# 控制器
# 只有两个动作: index 和 add
class controller(object):
    def index(self):
        return "do index()"
 
    def add(self):
        return "do show()"
 
 
# WSGI App, 详情请参考我前面的文章 python paste.deploy 探索
class App(object):
    def __init__(self):
        # 上面提到的 1, 2, 3, 4
        self.controller = controller()
        m = Mapper()
        m.connect('blog', '/blog/{action}/{id}', controller=controller,
                  conditions={'method': ['GET']})
        self.router = middleware.RoutesMiddleware(self.dispatch, m)
 
    @webob.dec.wsgify
    def dispatch(self, req):
        # RoutesMiddleware 会根据接收到的 url, 自动调用 map.match(), 做路由匹配,
        # 然后调用第一个参数, 这里即是 self.dispatch()
        match = req.environ['wsgiorg.routing_args'][1]
        if not match:
            return 'error url: %s' % req.environ['PATH_INFO']
 
        # 根据用户的请求动作, 调用相应的 action 处理函数(index/add)
        action = match['action']
        if hasattr(self.controller, action):
            func = getattr(self.controller, action)
            ret = func()
            return ret
        else:
            return "has no action:%s" % action
 
    @webob.dec.wsgify
    def __call__(self, req):
        return self.router
 
if __name__ == '__main__':
    socket = listen(('0.0.0.0', 8000))
 
    server = eventlet.spawn(wsgi.server, socket, App())
    server.wait()

Table of Contents

其它

关于使用 Mapper.resource() 来批量创建 RESTful API, 这里不介绍了, 详情请到 官网 查看

分类: programming, python 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.