On Apr 15, 2013, at 1:16 PM, Alex Ogier <alex.og...@gmail.com> wrote:
> The problem I have with fallthrough-based dispatch is that it encourages > really expensive performance-killing patterns, where you end up doing a > linear scan over view functions round-tripping to the database for each one > to see if the view can handle the request. multiurl is sort of nice because > it least it's obvious that what it's doing might be expensive, and the whole > linear scan is collected in one place so if it gets too long it looks "wrong" > in a Joel Spolsky sense. I don't see how including the method in the resolution scheme equates to hitting the database. > > I think what's really needed is a mechanism for more intelligent dispatch > decisions. The machinery is there in principle, and django-multiurl takes > advantage of it, but there's a bottleneck which is that in order for a view > to be correctly registered as a URL resolver with reversal, you have to go > through the narrow waist of the url() factory function. This means that while > multiurl is able to pretend to be like include() and delegate to its child > URL resolvers (which I think is what makes reverse() work), it can't really > add intelligence to its view dispatch, it can only sit on the outside > watching responses/catching specific errors, and you end up with N copies of > the regex (though perhaps this is actually a good thing, since it means you > can pass different arguments to different views). > > So for example, if you wanted to implement your own intelligent dispatch > function, you are forced to go digging into the internals to find things like > the fact that kwargs passed to the url() function end up as the > default_kwargs attribute on RegexURLResolver instances. Maybe the best option > is to ask Jacob to extend multiurl to support arbitrary dispatch mechanisms > that work in *front* of the URL resolver instead of behind it, maybe via a > callback in multiurl. The following looks like it would be just as easily > added to multiurl as to core, and not that much more onerous: > > from multiurl import multiurl, method_dispatch > > urlpatterns = patterns('', > multiurl( > url('^objects/$', 'views.create_object', methods=['post', 'put'], > name='create_object'), > url('^objects/$', 'views.get_objects', name='list_objects'), > dispatch = method_dispatch > ) > ) > > You might even convince Jacob to make multiurl do a lot of intelligent things > with those kwargs for free (no callback required). For example just have it > filter the views it tries to only the set that matches the HTTP method if > given. There's probably other types of dispatch that are naturally expressed > as properties of the URL object once you allow multiple URL objects per > regex, such as dispatching by the Accept or Accept-Language headers. All of > this stuff falls under multiurl's purview, at least if and until core > supports fallthrough URLs. > > Best, > Alex Ogier > > > On Mon, Apr 15, 2013 at 7:54 AM, Tom Christie <christie....@gmail.com> wrote: > This proposal is actually *very* similar to the 'URL dispatcher fall-though' > thread that came up recently. > > I don't think it'd take much adjustment to take Jacob's django-multiurl > project and adapt it to deal with method-based dispatching rather than > fall-through based dispatching. > > You should be able to end up with an API that looks something like this: > > from methodurl import methodurl > > urlpatterns = patterns('', > methodurl( > url('/objects/$', app.views.create_object, methods=['post', > 'put'], name='create_object'), > url('/objects/$', app.views.list_objects, methods=['get'], > name='list_objects'), > ) > ) > > Personally, I'm not particular convinced on the merits of method based > routing, but that's not really the issue. > The important point is that this is something that you should be able to do > without needing to modify anything in core Django. > > Regards, > > Tom > > On Saturday, 13 April 2013 22:48:44 UTC+1, Brantley Harris wrote: > There's a line in the django URL Dispatcher documentation that is pretty > weird: > > The URLconf doesn’t look at the request method. In other words, all request > methods – POST, GET, HEAD, etc. – will be routed to the same function for the > same URL. > > Well, why? Most modern web frameworks allow you to specify the method in the > routing configuration, Django seems to be an exception in this respect. > > It would be extremely easy to implement, and would lead to vastly better code > across new projects, including a simpler way of writing rest style interfaces: > > url('^objects/$', 'views.create_object', methods=['post', 'put'], > name='create_object'), > url('^objects/$', 'views.get_objects', name='list_objects'), > > This has come up many times before and been swatted down for various reasons. > One is that it could be implemented with a one-off dispatcher, as in: > > url('^objects/$', create_or_list(list=get_objects, create=create_object), > name='create_or_list_objects') > > But this is overly complex for what should be a simple configuration, forces > one to create the same name for the url, and worse, creates a level of > indirection breaking the abstraction up; or in other words you're trying to > do route configuration, why not do it in the place you're already doing route > configuration? > > The other argument is that you can do this with Class Based Views. I don't > believe this is a good argument as one would have to utilize Class Based > Views to get this basic functionality. In fact CBV's, only really solve two > common issues, one is the boilerplate inherit in forms, and the other method > routing. But the proposed solution to method routing is simpler and better. > > I will gladly implement the code required for this, but don't wish to do so > if it's going to be quashed, which is why I bring it up here. > > Thanks > > -- > You received this message because you are subscribed to the Google Groups > "Django developers" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to django-developers+unsubscr...@googlegroups.com. > To post to this group, send email to django-developers@googlegroups.com. > Visit this group at http://groups.google.com/group/django-developers?hl=en. > For more options, visit https://groups.google.com/groups/opt_out. > > > > > -- > You received this message because you are subscribed to the Google Groups > "Django developers" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to django-developers+unsubscr...@googlegroups.com. > To post to this group, send email to django-developers@googlegroups.com. > Visit this group at http://groups.google.com/group/django-developers?hl=en. > For more options, visit https://groups.google.com/groups/opt_out. > > ----------------- Donald Stufft PGP: 0x6E3CBCE93372DCFA // 7C6B 7C5D 5E2B 6356 A926 F04F 6E3C BCE9 3372 DCFA
signature.asc
Description: Message signed with OpenPGP using GPGMail