WebDispatch is dispatcher collection for wsgi application. That has no dependency to exsiting frameworks, but works fine with WebOb.
dispatch with url patterns.
example helo application:
>>> from webob.dec import wsgify >>> @wsgify ... def greeting(request): ... return "Hello, %s" % request.urlvars['name']
create and configure URL Dispatcher:
>>> from webdispatch import URLDispatcher >>> dispatcher = URLDispatcher() >>> dispatcher.add_url('top', '/hello/{name}', greeting)
invoke dispatcher as WSGI Application:
>>> from webob import Request >>> req = Request.blank('/hello/webdispatch') >>> res = req.get_response(dispatcher) >>> res.body b'Hello, webdispatch'
You can use wildcard after last slash. Pattern with wildcard consumes paths before the wildcard, (and make that new script_name,) and remained paths becomes new path_info.
>>> @wsgify ... def with_pathinfo(request): ... return "Hello, %s" % request.path_info >>> dispatcher.add_url('top', '/with_pathinfo/*', with_pathinfo) >>> req = Request.blank('/with_pathinfo/this/is/pathinfo') >>> res = req.get_response(dispatcher) >>> res.body b'Hello, this/is/pathinfo'
You can specify converter with varname below ":".
>>> @wsgify ... def add(request): ... result = request.urlvars['v1'] + request.urlvars['v2'] ... return "result, %d" % result >>> dispatcher.add_url('add', '/add/{v1:int}/{v2:int}', add) >>> req = Request.blank('/add/1/2') >>> res = req.get_response(dispatcher) >>> res.body b'result, 3'
default converters are defined as bellow:
DEFAULT_CONVERTERS = { 'int': int, 'date': lambda s: datetime.strptime(s, '%Y-%m-%d'), 'date_ym': lambda s: datetime.strptime(s, '%Y-%m'), }
ActionDispatcher invokes object method with action name from urlvars.
action handler class:
>>> class MyHandler(object): ... @wsgify ... def greeting(self, request): ... return "Hello"
create and configure ActionDispatcher:
>>> from webdispatch import ActionDispatcher >>> actiondispatcher = ActionDispatcher() >>> actiondispatcher.register_actionhandler(MyHandler)
add action url with urlvars named action:
>>> dispatcher.add_url('action_dispatch', '/actions/{action}', actiondispatcher)
invoke wsgi appclication.:
>>> req = Request.blank('/actions/greeting') >>> res = req.get_response(dispatcher) >>> res.body b'Hello'
dispatch by HTTP METHOD restfully.
use register_app
decorator:
>>> from webdispatch import MethodDispatcher >>> restapp = MethodDispatcher() >>> @restapp.register('get') ... @wsgify ... def get_hello(request): ... return "Get Hello" >>> @restapp.register('post') ... @wsgify ... def post_hello(request): ... return "Post Hello"
or use registe_app
method:
>>> from webdispatch import MethodDispatcher >>> restapp = MethodDispatcher() >>> restapp.register_app('get', get_hello) >>> restapp.register_app('post', post_hello)
Each applications are registered with HTTP Method name.
invoke WSGI application:
>>> req = Request.blank('/') >>> res = req.get_response(restapp) >>> res.body b'Get Hello'
DispatchBase
accepts extra_environ
argument.
Dispatcher adds that argument to wsgi environ by request.