开发者

Non regex WSGI dispatcher

I've found this regex based dispatcher but I'd r开发者_开发知识库eally rather use something that only uses literal prefix strings. Does such a things exist?

I know it wouldn't be hard to write but I'd rather not reinvent the wheel.


Flask / Werkzeug has a phenomenal wsgi url dispatcher that is not regex based. For example in Flask:

@myapp.route('/products/<category>/<item>')
def product_page(category, item):
    pseudo_sql = select details from category where product_name = item;
    return render_template('product_page.html',\
                      product_details = formatted_db_output)

This gets you what you would expect, ie., http://example.com/products/gucci/handbag ; it is a really nice API. If you just want literals it's as simple as:

@myapp.route('/blog/searchtool')
def search_interface():
    return some_prestored_string

Update: Per Muhammad's question here is a minimal wsgi compliant app using 2 non-regex utilities from Werkzeug -- this just takes an url, if the whole path is just '/' you get a welcome message, otherwise you get the url backwards:

from werkzeug.routing import Map, Rule

url_map = Map([
    Rule('/', endpoint='index'),
    Rule('/<everything_else>/', endpoint='xedni'),
])

def application(environ, start_response):
    urls = url_map.bind_to_environ(environ)
    endpoint, args = urls.match()
    start_response('200 OK', [('Content-Type', 'text/plain')])
    if endpoint == 'index':
        return 'welcome to reverse-a-path'
    else:
        backwards = environ['PATH_INFO'][::-1]
        return backwards

You can deploy that with Tornado, mod_wsgi, etc. Of course it is hard to beat the nice idioms of Flask and Bottle, or the thoroughness and quality of Werkzeug beyond Map and Rule.


Not exactly what you describe, but your needs may be served by using bottle. The route decorator is more structured. Bottle does not host WSGI apps, though it can be hosted as a WSGI app.

Example:

from bottle import route, run

@route('/:name')
def index(name='World'):
    return '<b>Hello %s!</b>' % name

run(host='localhost', port=8080)


I know it's been a few years, but here is my quick and dirty, drop-dead simple, solution.

class dispatcher(dict):
    def __call__(self, environ, start_response):
        key = wsgiref.util.shift_path_info(environ)
        try:
            value = self[key]
        except:
            send_error(404)
        try:
            value(environ, start_response)
        except:
            send_error(500)

Notes

  1. We leverage the built-in 'dict' class to get a lot of functionality.
  2. You need to supply the send_error routine.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜