On Jun 16, 2009, at 11:02 AM, Sergey Schetinin wrote:
...
indeed there are quite a few
frameworks / components that do this thing and I kind of don't get why
people want to write their apps that way. I wonder if Jim or anyone
else could explain the rationale behind all these URL routing
libraries. Nobody minds calling functions from other functions --
that's basics of programming, but for some reason URL dispatching is
seen as something different. Why?

This is not a criticism, I just really would like to understand this.


Fair enough. I'm not sure I understand your question. You need some way of mapping URLs onto Python objects that handle them. You can do this on a case by case basis by inspecting a URL and doing some sort of ad hoc dispatch in your application. Is that what you mean by "calling functions from other functions"? I've found it useful to have a standard mechanism for this that you can use over and over without reinventing it each time.

In the original bobo (aka "python object publisher") that I wrote in '96, I mapped URLs onto object names in modules. Later, I extended this to use object keys and this grew into a traversal model. There were some difficulties with this approach:

- I needed some way to decide which objects should be URL accessible. This led to some less than optimal rules.

- The traversal model mapped well onto an object database, but not so well onto relational models.

Many people have taken the approach of providing an explicit separate (from code) mechanism of mapping URLs onto their Python objects. Usually, this involves having a table mapping URL patterns of some sort onto object identifiers. I like explicit. :)

BTW, Chris McDonough provides a nice comparison of traversal and what he calls "URL Dispatch" based on a mapping table (Pylons routes) in:

 
http://docs.repoze.org/bfg/narr/urlmapping.html#differences-between-traversal-and-url-dispatch

One of my goals with bobo is express web applications with Python as much as practical. While bobo does support the ability to provide an external mapping, I definitely wanted to be able to express the mapping in the code. One of the advantages of recreating bobo in the 21st century is that I get to use Python decorators, which provide a way to be very explicit about which objects are available to handle URLs. (Other web frameworks use decorators for this purpose too. Bobo is *not* revolutionary in any way. :)

I find the route syntax used by Rails and Pylons to be very appealing. It uses fairly simple path patterns with placeholders. It doesn't use regular expressions. I don't personally care for the controller+action model used by Rails and borrowed by Pylons, so, after looking at using Pylon's routes implementation, which I took a lot of inspiration from, I went with a slightly different model. Basically, a route maps onto an object and when a URL matches a route, we call the object. (Of course, there are other details, but they're covered by the bobo documentation.)

I hope this helps and that I haven't totally misunderstood your original question.

Jim

--
Jim Fulton
Zope Corporation


_______________________________________________
Web-SIG mailing list
Web-SIG@python.org
Web SIG: http://www.python.org/sigs/web-sig
Unsubscribe: 
http://mail.python.org/mailman/options/web-sig/archive%40mail-archive.com

Reply via email to