The whitespace thing really isn't an issue after a short time with it. The only thing that bites me is not being able to have empty blocks, and the existence of the
pass statement as a workaround.
Code:
def new_function():
# TODO
IndentationError: expected an indented block
def new_function():
pass
def new_function():
"docstring"
The O and R parts of ORM aren't necessarily mandatory - it's really about runtime in-memory data structures to persistent storage structures mapping, except "RIMDSTPSSM" never caught on. If you don't have any object inheritance or composition to map, you ignore those parts of the ORM and the relational stuff they map to. That said, each ORM-like approach will bring some limitations - while doing a lot more out of the box than you could implement yourself.
One thing Django is good at is authentication. It has a lot of stuff to get you started quickly ... and after a while, you may find you want to replace some of its approaches, but at least you can do that, module by module.
Some would say, for a real web app, don't even think of flat files. Assume the database will be provisioned by someone, and will run on multiple servers separate from your app. Also assume you don't have any persistent local storage outside a managed database and whatever can be configured via a hosting admin interface. Obviously not in initial iterations - but it helps to plan for it. Understand
The Twelve-Factor App and at least know when you are not ready to follow each principle.