It's been a while since picking up rust, but until now, most of what I've written has been CLI tools, proc macro libs, and async networking stuff. Web/application servers have been kept at arm's length while waiting for something to come around like Django.
For those not in the know, Django is a web framework written in Python. It's opinionated, extensive, has many features, and has stellar documentation. It's old too and had major problems taking advantage of (back them) python's new async
capabilities as well as "new" technologies like WebSockets. Popular frameworks popped up in the meantime like Flask and FastAPI that do use new technologies and python language features like type hints, however nothing has really come to be quite like Django.
Django's ORM
As usual, there are camps when it comes to this, but I'm in the "keep SQL away from me" or "one language for all" camp. Django's ORM does a mighty fine job of doing so. It's possible to write a django application without ever seeing a line of SQL. It helps me immensely to just think about models, application logic, and presentation.
Django allows defining your models in python, generating and handling database migrations, making complex queries of 1-1, 1-n, m-n relations without an SQL syntax, storing objects, locking rows, optimising queries (again without knowing SQL), and much more.
Queries
My favorite, powerful query simplifications are QuerySet.select_related()
and QuerySet.prefetch_related()
.
An example of Queryset.select_related:
This is useful for a tree of 1-n objects. An example from the documentation: a Book
has an author
(foreignkey) which is a Person
(1-n), with a hometown
(foreignkey) that is a City
(1-n). An author can have written many books (n-1), a city can have many people (1-n).
Say you wanted to find 10 books from an author that lives in "Marrakesh" with the associated objects (Book
, Person
, City
). In Django that's
# Hits the database with joins to the author and hometown tables.
books = Book.objects
.filter(author_hometown__name="Marrakesh")
.select_related("author__hometown")[:10]
book = book[0]
person = book.author # Doesn't hit the database.
city = person.hometown # Doesn't hit the database.
QuerySet.prefetch_related()
does the same for m-n / many-to-many relationships and some other queries (see doc). No messing around with SQL, just python.
Migrations
The ORM also takes care of generating and managing migrations for you. To me, that's a major plus as it offloads the need for me to think about whether a specific type exists in the DB of choice. Most of the time django will handle it transparently. There are even django extensions / apps to optimise more SQL query generation like adding views, or choosing which index to use for a specific type or table, and so on.
Django's documentation
If I'm not mistaken, it follows the diátaxis method of documentation

which fits the project very well and allows getting started with django very easily as well as finding good, low-level, in-depth information quickly. Many projects have documentation but it's everywhere and nowhere in terms of location (where to find specific things) and depth (high-level vs low-level), making it less optimal for beginners and experts alike. If you want to step up your documentation game, do give diátaxis a shot.
What prompted this
I'm currently 3 days into exploring the rust web framework ecosystem and banging my head against it. It's very commendable what people have written in their free time and shared with the world, so I will not disparage any projects here. It would just be really cool if a django-like, batteries-included project started or reached production quality sometime. The closest candidate I found is Cot.
Cot started in June 2024 and is a long way from django's level but has already grown to something quite impressive. If time allowed it and the project weren't on GitHub, and had a matrix chatroom, it would surely get contributions from me. Here's the announcement on the main dev's blog, which reflects some of my frustrations with the current web framework ecosystem in Rust.
Until Cot is ready, I'll probably be using axum for application server, diesel for the DB-glue, and possibly leptos, yew, or just plain Rinja. Unless of course somebody knows of a django-like web framework in rust that isn't on awesome-rust...
Anti Commercial-AI license
I wish more pirates used I2P. But it seems like many cannot deal with waiting a day for their download to finish.
Anti Commercial-AI license