Channels adopted as an official Django project
djangoproject.com
djangoproject.com
Initial plans for the Mozilla grant also included making DRF an official Django project, but details are sparse.
I particularly don't understand the "complex front-end" part. What about django's templating system hinders implementing a rich javascript based UI?
I've been quite happy using the templating system to deliver data to the front end and then using whatever js libs / frameworks I've needed to display the data to the user....
1. Data races - Use a combination of model versioning and uniqueness checks to prevent data races.
2. get_or_create/update_or_create - Duh, the atomicity is enforced by the parameters you use. Create unique indexes on the model for the things you expect to use in your parameters
Django also lets you have fine-grained control of when code will or won't execute in a transaction, so relying solely on transaction isolation (when code might not be running in a transaction, either due to global configuration or local override, and which may be a bad idea anyway -- see next paragraph) doesn't get you all the way to safety for get_or_create()/update_or_create(), hence the documentation recommends you either be careful or use query parameters which involve DB-level uniqueness constraints. Also, for the record, you can tell Django to only query for or update a particular set of columns on a model when round-tripping to and from the DB; the default behavior when you don't explicitly specify a set of columns is to retrieve or insert all of them.
The advice to use READ COMMITTED on MySQL is due to MySQL. On SQLite, the only available behavior is equivalent to SERIALIZABLE. On Postgres, REPEATABLE READ guarantees that, once a transaction begins, changes made in other concurrent transactions will not be visible to it. On MySQL... REPEATABLE READ guarantees that, once a transaction begins, changes made in other concurrent transactions will not be visible to SELECT queries. INSERT, UPDATE and DELETE, however, still see those changes and will happily bomb you out with integrity errors because you did a SELECT (in order to determine whether to follow up with INSERT or UPDATE) and another transaction changed the data you were working with. So on MySQL, REPEATABLE READ is discouraged. If your workload can handle it, by all means use SERIALIZABLE instead, but most people can't and so end up with READ COMMITTED, which at least reduces the window of opportunity for another transaction to make surprising changes to data you're working with. Django also provides access to SELECT FOR UPDATE to allow locking rows you're about to mess with.
I've skimmed the rest of the article and it appears to mistake abrasiveness for honesty and hyperbole for insight, with a healthy dose of representing subjective disagreement over design as a matter of objective correctness or incorrectness. But if you've got questions about other claims it makes, I'm willing to answer them.
Now if you had mentioned heavy concurrency I might actually take your comment a bit more seriously. Then the answer is don't use Django or python, use golang or C/Rust.
If you have an sql based system and you aren't relying heavily on optimistic/pessimistic locking for record mutation, there is a good chance your system has all kinds of risks to lose data.
Ditching Django and using SQLAlchemy or even just the lowly dbapi directly will not alter this fact; indeed, it is something everyone who works with a database should know.
If you're having concurrency issues in your app, it isn't due to the web framework OR the database, it is due to poor application design. Period.
Vague rebuke: In my experience, Django actually does very well compared to a lot of other solutions. So there.
Heroku has a short tutorial building a chat app at https://blog.heroku.com/in_deep_with_django_channels_the_fut...
You can find more example projects at https://github.com/andrewgodwin/channels-examples