
Ask HN: Django vs. Flask - pygix
I am noob to programming, python, and of course web development. Which framework django, or flask to start learning?
======
lastofus
Flask for learning from the ground up. Django after coming to the realization
that large Flask projects end up cobbling together 80% of what Django offers,
usually poorly.

~~~
odonnellryan
Sort-of true on your second point. Flask gives you more room to organize the
project how you want: if you don't have experience doing this then yeah,
you'll make a mess. However, with experience comes more power. You aren't
forced into doing things the "Flask way" because there is no "Flask way."

------
joeclark77
It depends on the application. Do you care about how things work inside your
database? Do you want to understand how the subsystems of your app (like
authentication, security, the API, etc) work? Flask allows you (and forces
you) to make your choices explicit. Django makes the decisions for you and
hides its workings under layers of abstraction.

I can see using Django to rapidly prototype some kind of CRUD app, but on the
other hand, you could just use Wordpress for that. Flask seems like it would
be a superior platform for engineering anything non-trivial, especially if you
care about how it works.

~~~
odonnellryan
> I can see using Django to rapidly prototype some kind of CRUD app, but on
> the other hand, you could just use Wordpress for that. Flask seems like it
> would be a superior platform for engineering anything non-trivial,
> especially if you care about how it works.

I feel like I'm replying a lot in this thread!

I think it's the other way around. If you want to QUICKLY prototype something,
use Flask: it's light weight, and your app will _literally_ be one hundred-
line file + some templates.

If you know you're going to use much of the common Django tools, use Django.
Django projects are usually harder to spin up in my experience.

I wouldn't relate Django to Wordpress at all. It'd be tough to get a Wordpress
type platform from scratch in Django OR Flask.

~~~
brianwawok
Use cookie cutter Django and just prototype in Django. Maybe 50 more lines
than flask but it was a got clone not code you wrote.

------
jventura
My suggestion for beginners:

\- If you want to do simple apps that do not touch the DB, or any kind of
persistence, you can start with Flask. Much simpler to start.

\- For a more integrated experience on web development, including DBs, use
Django. Their tutorial is very very good:
[https://docs.djangoproject.com/en/1.10/intro/tutorial01/](https://docs.djangoproject.com/en/1.10/intro/tutorial01/)

I teach these subjects in a local university to BSc and MSc students, and
since I want them to learn fast and lots of functionalities regarding web dev,
I go directly to Django (after teaching them basic http with python and
sockets - like this: [http://joaoventura.net/blog/2017/python-
webserver/](http://joaoventura.net/blog/2017/python-webserver/)).

------
znt
You should try both. Choose a project and implement it using the two.

Start with a basic todo list. Then add support for permissions. Then add
support for versioned entries. Then add a REST layer on top.

------
tony
You can get pretty far with Flask. You'll need an ORM, so you'll likely chuck
SQLAlchemy in. Then you'll want easier access to SQLAlchemy, sorta like, you
know, django does it, so you pick up [https://github.com/mitsuhiko/flask-
sqlalchemy](https://github.com/mitsuhiko/flask-sqlalchemy).

But you can't use pure SQLAlchemy models (easily), since this otherwise great
extension for flask doesn't support it ([https://github.com/mitsuhiko/flask-
sqlalchemy/pull/250](https://github.com/mitsuhiko/flask-sqlalchemy/pull/250),
yes I'm in the thread).

You'll fork it or brew your own code to get declarative models working right.
Kinda time consuming, but at least your models can be pulled in by _any_
python code, and aren't tied down to a framework (That's what you were
avoiding from the first place, wasn't it?)

Then you'll pick up WTForms
([https://wtforms.readthedocs.io/en/latest/](https://wtforms.readthedocs.io/en/latest/)),
another excellent library. And you'll miss having Django ORM's rich form and
model-backed validation. So you'll try wtforms-alchemy,
[https://github.com/kvesteri/wtforms-
alchemy](https://github.com/kvesteri/wtforms-alchemy).

Then you'll begin to see why Django makes sense after using Flask for a while.
Django pulls in all the essential stuff and supports it well.

And top of that, django's addons like django-extensions ([https://django-
extensions.readthedocs.io](https://django-extensions.readthedocs.io)), which
gives you Werkzeug's debugger if you use ./manage.py runserver_plus. And
./manage.py shell_plus, which integrates with ptpython/ipython/bpython
([https://django-
extensions.readthedocs.io/en/latest/shell_plu...](https://django-
extensions.readthedocs.io/en/latest/shell_plus.html)).

Django rest framework, DRF for short ([http://www.django-rest-
framework.org/](http://www.django-rest-framework.org/)), which is very mature
at this stage, runs circles around Flask API. Flask API is inspired by DRF.
You could also try [https://flask-restful.readthedocs.io](https://flask-
restful.readthedocs.io), but after all that, you'll be missing that tight
model support.

You'll _love_ flask. The code is top tier and exemplary. The testsuites are a
dream and are very clear. Documentation is awesome. It feels good to code in
it. But django feels good to code in as well.

Django's ORM is very mature. It's easier than SQLAlchemy, and despite
SQLAlchemy's purity, and documentation - even better than flask's - Django's
ORM does the trick for pretty much anything, even foreign databases I've
interacted with. Another thing, QuerySet's are a charm, a lot of django's
addons like django-filters, django-rest-framework and django-tables2 are built
on top of its versatility.

Another thing Flask community ends up having to clone from Django is django-
debug-toolbar [https://github.com/django-debug-toolbar/django-debug-
toolbar](https://github.com/django-debug-toolbar/django-debug-toolbar). See
[https://flask-debugtoolbar.readthedocs.io](https://flask-
debugtoolbar.readthedocs.io).

Again, I love flask, but when I realized that I'm just going to end up
reinventing django with my flask app anyway, I started going with django on
new projects. I haven't turned back, but still check out flask and sqlalchemy
to see what's happening now and then.

~~~
joeclark77
I think the first objection one would raise is that you don't _need_ an ORM at
all. It all depends on the application, of course, but ORM means giving up a
lot of control (and transparency, and understanding) of your database in
exchange for a few shortcuts regarding things like M:M links.

~~~
odonnellryan
IMO, if you're using an ORM because you want many-to-many to work in a neat
way, then you're using an ORM for the wrong reasons.

Use an ORM because tools like this:
[https://marshmallow.readthedocs.io/en/latest/](https://marshmallow.readthedocs.io/en/latest/)
work really well with it.

And tools for migrations: [https://sqlalchemy-
migrate.readthedocs.io/en/latest/](https://sqlalchemy-
migrate.readthedocs.io/en/latest/) start to make sense in your code.

You don't need an ORM to do either of those things, but it makes things a hell
of a lot more organized. Makes the database easy to understand from your code.
Makes things like "testing from a blank database" really nice.

You don't ever _need_ an ORM, but for 90% of projects you'll use Flask and a
Database for, it makes your life a lot nicer.

~~~
joeclark77
I actually wrote a blog post about my experimentation with ORM (here:
[https://joeclark.svbtle.com/understanding-the-m-in-
mvc](https://joeclark.svbtle.com/understanding-the-m-in-mvc)). From the
viewpoint of a database geek, somebody who cares about his database, those
gadgets you linked are further reasons to dislike ORM, because they do more of
what ORM does: take away transparency and control in exchange for "shortcuts".
And what happens when those tools fail? ("migrate" is particularly screwy).

No, it's a matter of philosophy. The newbie who has learned to code without
ever being taught SQL, and the employee of an "agile" app sweatshop who
doesn't care about the quality of his code or data, may prefer ORM for its'
quick-and-dirtiness, or may use it by default because he knows no better way.
I'm not saying that's wrong, but, there are other philosophies. There is the
whole "craftsmanship" idea out there, that we should actually care about
making things well. Jobs and Wozniak for example supposedly were adamant that
the _insides_ of Apple computers were designed well. If you care about your
database and want to use special features like triggers, procedures, recursive
queries in Postgres, etc., then ORM is about as helpful as clamshell
packaging.

~~~
odonnellryan
This is a good point, but it can definitely be applied to any abstraction. I
don't think ORMs are the best use of abstraction, but I think they're far from
the worst use. For most applications they let you do a lot more a lot quicker
without knowing a lot of SQL.

> And what happens when those tools fail?

I haven't used any of these tools that don't let me fall back on raw SQL or
writing my own migration in SQL and including it in my code (outside of the
DB). So, I haven't had this problem, honestly! Most DB problems I've had are
related to _design_. There is an argument there to be had: "Do ORMs encourage
bad database design?" but it's a different topic, in my opinion.

> There is the whole "craftsmanship" idea out there, that we should actually
> care about making things well.

Making a website is a completely different process than making a chair, or
remodeling a kitchen, or designing hardware for a computer.

I absolutely make technology that is great, and I do take pride in my work,
but if I didn't use an ORM it'd take me much longer to make: and the
application would be much less maintainable.

> If you care about your database and want to use special features like
> triggers, procedures, recursive queries in Postgres, etc., then ORM is about
> as helpful as clamshell packaging.

I use all these things all the time. I've created migrations in Django to
create my Postgres FTS trigger function. Now all these raw-SQL migrations are
stored very nicely in their own space, and in version control. And it's just
like I typed them into the SQL prompt: but I can just look in my codebase and
see what I did :)

You can'd even do sub-selects nicely in Django ORM, forget recursive queries.
But you can use raw SQL when you need it!

------
tedmiston
You'll learn more starting with Flask because it provides less layers and
components (and a far smaller codebase). Eventually you'll build up several of
the pieces yourself or combine various libraries and eventually realize it
would be much simpler to rewrite in Django. At least that's how it's worked
out over the past few years for me on anything over 100 lines or so.

------
jeromesalimao
I'm also a noob. To hack together a quick app to hit a few of the instagram
endpoints I went with flask. In my case, it was just a matter of writing a few
annotated methods, and plugging in some template files and I was up and
running in a few hours!

I'm now looking at SQL alchemy and thinking I might try to taking another look
at Django...

------
fiftyacorn
Django - but my advice is not to start from two scoops - its a great book but
your best bet is to work off the djangoproject, or djangogirls tutorials as
thats the common project structure. once you have a handle on this start
reading two scoops

------
yoongkang
Django because there are a lot more resources, and the community is pretty
welcoming to beginners -- so it's very easy to find help.

If you are in need of a beginner-friendly tutorial, I would recommend the
Djangogirls tutorial.

------
tixocloud
Although we use Django, I think Flask is a great starting point for learning
web development.

