Pattern-matching based WSGI-compliant URL routing tool
Project description
Decorator style and pattern-matching based url routing library. No framework! Very compact. Core logic less 100 lines of code. WSGI compliant. No additional API required.
Complete example
import decoroute app = decoroute.App(prefix='') # pure WSGI @app.expose('/wsgi/<id:\d+>') @decoroute.wsgi('wsgiorg.routing_args') def wsgi_app(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) return environ['wsgiorg.routing_args'] # pass variables into **kw def render_response(status = '200 OK', content_type = 'text/plain', add_headers = [], **context): return status, [('Content-Type', content_type)] + add_headers, context @app.expose('/node', id = '1') @app.expose('/node/<id:\d+>') def node(env, id): return render_response(id = id) @app.expose('/url_for') def url_for(env): return render_response(url = app.url_for(node, id = 666)) @app.expose('/404') def not_found(env): raise decoroute.NotFound() @app.not_found def not_found_handler(env): return render_response(status = '404 NF', **env) @app.render def render(env, (status, headers, context)): context['site_uri'] = '%s://%s' % (env['wsgi.url_scheme'], env['HTTP_HOST']) return status, headers, ['%s=%s\n' %(k, context[k]) for k in context.keys()] # fake templating from wsgiref.simple_server import make_server make_server('', 6666, app).serve_forever()
Tips
If you place your views (Django term. in ror - controller) in another modules, organize code like werkzeug.
# utils.py import decoroute app = decoroute.App()
# view.py and anoter from utils import * @app.render def render(env, ...) # returns of your endpoints pass to render handler # in render use your prefered template engine and return triple # status, generator of response headers, generator of response body # ( generator / iterator / list - any ) # if you use default render endpoints must be return triple @app.not_found # no route enpoint # it also pass to render handler @app.expose('/node', id = '1') @app.expose('/node/<id:\d+>') def node(env, id): # endpoint passed some variables # env is a wsgi environ # id = '1' default value of parameter # all parameters must be <type 'str'> # <id:\d+> parameter pattern; # \d+ specify regexp constraint of parameter (required)
# manage.py - main module from utils import app import view # and all other if __name__ == '__main__': # serve app here
Legal
decoroute distributed under terms of GNU LGPL v.2.1.
Copyright 2008 - present Vsevolod Balashov.