In my experience, growing bigger with Pyramid has been much easier than it has been w/ Flask. We found ourselves writing most of Pyramid using Werkzeug when it would've made sense to start off with Pyramid in the first place.
Pyramid's design for extensibility and design decisions are solid and really make a difference if you're building a real app vs a toy app.
There's no real productivity boost between the two in my experience. Those holes in Django's ORM that need to be plugged by raw SQL aren't all that common anyhow. The VAST majority of SQL queries you will need the Django ORM can handle.
In projects I've worked on that don't do weird, strange or bad things with the database (e.g. ignoring foreign keys), the total number of custom, raw SQL queries has been between 5 and 20. Using an ORM for them instead wouldn't have saved more than a couple of lines of code total, if that.
What you DO get with Django's ORM that you don't with SQL Alchemy is the benefit of integration with all of the other django tools and modules - that saves you having to write a TON of code.
For the Django part of your comment the other modules it provides are useful for building a website but not an API which was in the root comment. Indeed for a website Django is my preferred tool too. Although in a project where I know the API is the core I would choose something lighter weight (using flask in my current project but learning from comments here Pyramid is something to look into too) and then build the portal in Django, handle user authentication there and allow access to the authenticated users to the API via requests signed in Django or direct access via API keys. In my experience it's the fastest/most flexible approach in terms of dev.
Consider yourself corrected.
>read this blog for an full comparison http://lucumr.pocoo.org/2011/7/19/sqlachemy-and-you/ (quite old).
That's not a full comparison. It actually doesn't even touch on some of the advantages to using SQLAlchemy (i.e. in the more complex queries). It even says this at the bottom. Did you see that?
>For the Django part of your comment the other modules it provides are useful for building a website but not an API which was in the root comment.
So now APIs don't require integration work? When I build ANYTHING I want to be able to have as large an ecosystem of libraries to pull from as possible because it will save me from writing unnecessary code and reinventing the wheel. First thing I do before building anything is to check on pypi to see if somebody wrote it first.
Too many junior developers make the mistake of thinking that their problem, project or app is somehow a unique snowflake and end up reinventing the wheel because they had no idea the wheel existed. Semi-experienced developers will still make this mistake by making bad architectural decisions in the name of flexibility or performance that end up locking them out of library ecosystems that means they are forced to reinvent the wheel even when they know it exists.
Being an experienced architect means (among many other things) knowing when to make the trade off between not railroading your code unnecessarily and standardizing it enough to let you use the vast array of free libraries out there.
>Although in a project where I know the API is the core I would choose something lighter weight
It's a myth that Django is heavy weight. You can make a django app with about 10 lines of code in one file using just the URL router if you really want to. Each one of the components can be swapped out nearly seamlessly exactly like with Flask.
You might not want to use it because it's slow, however, but flask will be too.
Well those are most of the comparisons that could be made, from the top of my head I can't think of any other features that the two share.
> Too many junior developers make the mistake of thinking that their problem, project or app is somehow a unique snowflake and end up reinventing the wheel because they had no idea the wheel existed. Semi-experienced developers will still make this mistake by making bad architectural decisions in the name of flexibility or performance that end up locking them out of library ecosystems that means they are forced to reinvent the wheel even when they know it exists.
Doesn't sticking with Django lock you into the ORM and it's capabilities itself? Unless the library you're using is a Django extension you have the same pool of libraries available to you, so that's an invalid point.
> It's a myth that Django is heavy weight.
I saw that blog post too, however by heavy weight I meant all the remaining stuff you don't need for an API, e.g. you don't need the template, view, form, ... layers
Again my argument is based on building an API not a Website.
Not really. You're always free to use raw SQL, and it makes it pretty convenient to do so for the occasions when what you want exceeds the ORM's capabilities (which will likely happen).
>Unless the library you're using is a Django extension you have the same pool of libraries available to you, so that's an invalid point.
I was talking about the django extensions. Stuff like a rate limiter, for instance, or a pluggable social media authentication backend. Or the one mentioned by the OP. All useful when making APIs.
>I saw that blog post too, however by heavy weight I meant all the remaining stuff you don't need for an API, e.g. you don't need the template, view, form, ... layers
You're not railroaded into using any of those things if you don't want to (the same way you are with RoR). All of them are optional and most of them are even swappable without too much effort.
> Not really. You're always free to use raw SQL, and it makes it pretty convenient to do so for the occasions when what you want exceeds the ORM's capabilities (which will likely happen).
I can't argue with this, fine.
> Stuff like a rate limiter, for instance, or a pluggable social media authentication backend. Or the one mentioned by the OP. All useful when making APIs.
Rate limiter is framework independent, can be built using Redis with a few lines of code. So not applicable.
Pluggable social media authentication backend is for websites not APIs for APIs you most commonly use API key/secret. for an api you can still build your portal in Django and do all authentication/whatever there and simply sign requests for the API.
> You're not railroaded into using any of those things if you don't want to (the same way you are with RoR). All of them are optional and most of them are even swappable without too much effort.
I am familiar with Django, and I know that you can (not the ORM though), but do you want to drive a monster truck when all you need is a car to get around? You could, you will get odd looks though.
Since you can't use Django's ORM anywhere else you need to use something that another "car" supports.
I'll leave you with: "if all you have is a hammer everything looks like a nail"
The two are inextricably linked as far as this thread is concerned.
>Rate limiter is framework independent, can be built using Redis with a few lines of code. So not applicable.
Mine is apparently 200 lines of code (library total) and tied to the framework. I guess you are more of a "reinvent the wheel" type programmer.
>Pluggable social media authentication backend is for websites not APIs
APIs do all manner of different things.
Last time I built an API it was a back end for an iphone app. It needed an authentication backend. By using a pluggable framework I could not only let the app log in/sign up using facebook tokens, I could with one added line add twitter or ~40 other back ends, saving me from... reinventing the wheel.
> for an api you can still build your portal in Django and do all authentication/whatever there and simply sign requests for the API.
Or you could just use django for the API as well the portal since it handles everything about making APIs pretty well (with the exception of high load APIs).
>for APIs you most commonly use API key/secret.
For APIs there are many common ways of doing authentication. There's no standard. Basic auth over https, token, oauth, key/secret, cryptographic signature. If you ascribe to a "one true way" you lack judgement and experience.
>I am familiar with Django, and I know that you can (not the ORM though), but do you want to drive a monster truck when all you need is a car to get around?
I already refuted your point that it was a monolithic heavyweight beast. It's composed of multiple small modules all of which exhibit loose coupling and each of which can be used independently or not at all.
>Since you can't use Django's ORM anywhere else
Utterly false. You can use it wherever you like, independently of everything else (sometimes I do that).
Feel free to argue that you don't like it or it's wrong for whatever situation but please refrain from making shit up to justify your point.
Some advice also: curb your instinct to reinvent the wheel, no matter how simple that wheel may seem.
You're just arguing like a 10 year old fan boy now. Django is great for sites I love it. I also use other tools when I need different things. As for reinventing the wheel it's a very simple code snippet taken from a reliable source then changed to fit needs. So go home sleep learn new things... Don't attempt to build the next OS in Django.