I mostly agree with the author of the article: ever try to modify the User object to accept an email instead of username for login purposes? It's a complete hack.<p>The thing is, it didn't <i>need</i> to be a hack, but some of the core components are really tightly coupled together when they don't need to be, so it ends up being a hack. This tends to happen a lot when you 'go outside the box' of Django's codebase.<p>For example, everyone says you can 'use SQLAlchemy' in Django. On paper this is true. But then you lose the admin, the user auth system, the messages system, model forms, and all of the other batteries that make Django useful.<p>That said, the alternatives to Django are so incredibly lacking that (for the moment), I'd rather stick with Django than roll my own everything else. Pylons and Turbogears are an ugly mish-mash of third party libraries that don't work well together. In some cases there are good third party libraries (SQLAlchemy is indeed quite an amazing piece of software), but many other pieces are lacking:<p><pre><code> - Authentication/authorization libraries are terrible.
(You want to bury that in the middleware layer and use
query string parameters to indicate login failure? What?)
- Nothing out there is as good as Django's model forms.
- There is no equivalent to sorl-thumbnail, for basic image processing.
- The boatload of third party Django apps. Yes, most
of these are poorly written and not modular enough either
but there are some really useful ones out there like django-pagination
and django-compress.
</code></pre>
Django is far from perfect but unfortunately, taken as a whole, it's still better than the current alternatives.