Skip to main content

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

decoroute-0.8.1.tar.gz (5.9 kB view details)

Uploaded Source

File details

Details for the file decoroute-0.8.1.tar.gz.

File metadata

  • Download URL: decoroute-0.8.1.tar.gz
  • Upload date:
  • Size: 5.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for decoroute-0.8.1.tar.gz
Algorithm Hash digest
SHA256 54f3f9aef95ce17ad97dc745e6d8445402490bb0906d117a22e26260026bd649
MD5 f2af41ad753ad0ad39d728020ac2fe94
BLAKE2b-256 9b15a2efe5cc43a6d1f74e1e320acaee1d1dc7e7e24a1b0292d366171fc0579b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page