I think you can see one pilot of future decoupling with what is happening with the localflavors being split into separate repos - what we learn from this process will be valuable when/if considering decoupling other parts of Django.
Another major step is the pretty-far-along schema migration work from Andrew, which will allow for the potential of schema changes in upgrade scripts. I disagree that working on cleanly factoring and decoupling components "in place" isn't worth doing, in fact when you can add backends/plugability somewhere, and ship a BC version as the default - you've just fixed one of your "underlying problems" See for example: https://code.djangoproject.com/ticket/17093 There is no reason changes like that have to be part of a "2.0" departure, and in general talking about anything as being 2.0 related ultimately feels more distracting than productive. Anyway - as you say - progress has been made - lets do more of that ;-) -Preston On Tuesday, December 4, 2012 11:14:50 AM UTC-8, Yo-Yo Ma wrote: > > This morning read the SQLAlchemy proposal made by Luke Plant in June. I > then decided that this would be a good time to rant about abstraction, > extensibility, and decoupling. > > Background > ---------------- > > For years, Django has been forced to deal with most implementation issues > from within, including the ORM, templates, etc. Even things like JSON > support and basic timezones (for the new timezone module) were or are built > right into the framework, in order to handle heterogeneous environments and > Python versions, and to minimize external dependencies. This strategy > contributed to the success of Django, in part because finding nice, well > supported libraries was tough, and installing dependencies was too. > > The Python community has grown and its processes have matured nicely. > Nowadays, for a given problem, there are typically multiple solutions, many > listed on services like www.djangopackages.com. Installing packages is > easy, thanks to things like pip, and pypi. Collaboration is simpler, thanks > to services like GitHub. This trend can be summarized as abstraction, which > is a good thing. Handling things at a proper abstraction level is always a > time and heartache saver, and is of course the reason for using a framework > like Django in the first place. > > The Problem > ----------------- > > Solving too many problems from the top down, and coupling things too > tightly in a project leads to code rot, because implementations all have to > be written by somebody who is intimate with many other parts of the > framework, then they have to be vetted others who are intimate with many > parts of the framework, and then the code has to be maintained. Coupling > becomes an inevitability, simply because it is possible. Backwards > compatibility becomes more and more difficult and costly to maintain, and > prohibits growth. Projects built atop the framework eventually run into > problems for which the solution is to make changes to implementation > details (usually via subclassing, but in some cases, via monkey patches), > which leads to code debt in a project, and subsequent contention in the > community when implementation details are changed in a way that breaks > backwards compatibility for those "power users". > > This means that the issue of "We can't do that because it'll break things" > isn't really the problem that Django has. It's a symptom of another > problem, which is that Django is not nearly extensible enough (it's parts > are not pluggable enough, and or are not well enough abstracted to be > quickly changed and/or moved). > > So, what? > ------------- > > So, Django has evolved toward being a more decoupled, less monolithic > framework over the past couple years (e.g., the removal of auth's coupling > to things like messages, customizable user models, etc.), but there is a > lot left to be desired. I consider a Python web framework to be a minimum > of A) request handling, B) URL routing to something callable (a view), and > C) response handling. However, certain other things are good ideas to bake > in, such as cookie handling, security related features (CSRF, click > jacking, etc.), and probably a few others. Anything else should be > completely pluggable, and completely decoupled from everything else. > > Some examples which make me smile: > > Sessions - > Cache - includes support for plugging in a back-end and only defines a > simple interface (cache.set, cache.get, etc.) > Mail - includes support for writing / plugging the back-end of your > choice, only defines a simple interface (send_mail, send_mass_mail, etc.) > > Some examples which make me sad: > > Templates - unpluggable (importing a third party template library and > using it in your view is not plugging it in, since this isn't compatible > with 3rd party or contrib apps) > ORM - I'll defer to the complexities that arose from Luke's proposal > Admin - lacks abstraction, and therefore has some great tools that > can't really be used elsewhere (e.g., filter specs, sorting, etc.), lacks > usage of CBV, in favor of an ad hoc solution > > The Solution > ----------------- > > From an interface perspective, I have some ideas about how to handle the > templates side of things, and some pretty vague ideas of how to handle the > ORM, but I personally think that the real solution is to work not on > implementing new ideas and solutions to use beside or in place of existing > ones, but rather to fix the underlying problem that Django has. We can > fight an uphill battle constantly by trying to usher new ideas in over our > 12 foot wall, believing that it is indestructible, or we can work together > to "Tear down this wall!" :) > > Remember, we're at 1.5 now. If we have a specific goal in mind that is > very drastically different now, we can do a lot before 2.0 without breaking > backwards compatibility (at least not too badly). > -- You received this message because you are subscribed to the Google Groups "Django developers" group. To view this discussion on the web visit https://groups.google.com/d/msg/django-developers/-/Cm7hOv_kdGEJ. To post to this group, send email to django-developers@googlegroups.com. To unsubscribe from this group, send email to django-developers+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-developers?hl=en.