Hi,
This is the second feature proposal as part of my general drive for
getting Django to work better for javascript heavy sites.
Support a javascript template language on the server
----------------------------------------------------
The multiple template engine work has made it possible to switch out
Django Templates with another engine. One of the most powerful things
this enables is to use a template language that is executable both on
the server and client.
A typical use-case for this could be that you have a list of tweets on
your site. When the user first loads the page you send the full HTML for
all the rendered tweets over. When there's a new tweet you would like to
just add that one tweet to the list, without re-rendering the whole
page. Now you have a couple of options:
1. Reimplement the Django template code from your site in javascript.
This is harder the more complex the template your have. Also risks bugs
when you change the server-side template but forget the client-side one.
2. Use Pjax, render everything on the server and send the result to the
page. This sends unnecessary data over the wire, and requires that you
figure out how to append the data in the correct location.
3. Send the server-side templates to the browser, and then re-render on
the client when new data arrives. This uses the least data over the
wire, and does not require that you keep track of mappings, just update
the data and re-render everything (React.js's virtual DOM can make this
really fast if you need it to be).
Option 3 opens up lots of interesting use-cases for Django, that
previously was only possible for javascript-based frameworks.
---
To be clear, I'm not saying that Django should include any front-end
code at all. That's something that the individual developer should have
full control over. But what needs to happen is that the same templates
that Django uses needs to be accessible to, and executable in, javascript.
For this to work, two things needs to be built:
1. A way to access the template and the template context for a view
separately, so that it can be delivered to the client. Maybe the easiest
would be to modify django.shortcuts.render so it returns both the input
and the result. The client could then get access to this via a <script>
tag when the page renders.
2. A template language that has a solid javascript implementation. To be
able to render the templates the server side and client side must use
the same language. I see two options here, either make sure the Jinja
flavor we are supporting works with JS templatations (maybe
https://mozilla.github.io/nunjucks/ ?), or get a handlebars
implementation working with Django (https://github.com/wbond/pybars3 ?).
Or maybe there's some third option I didn't think of...
---
This would open up great possibilities for Django, with sites that would
feel much more responsive than today. It would be possible to build
something like Meteor.js on top of Django, that propagates changes in
the database all the way to the correct DOM node in the browser.
Would anyone we willing to work with me on this? I think the changes to
django.shortcuts.render() is something that would have to happen in
Django, but the new template engine is something that could be done as a
separate project I guess.
Thoughts? Ideas?
(And yes, for people seeing the connections between this feature and
template components, you are right: they would be awesome together)
Regards,
Emil Stenström
Twitter: @EmilStenstrom
--
You received this message because you are subscribed to the Google Groups "Django
developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to django-developers+unsubscr...@googlegroups.com.
To post to this group, send email to django-developers@googlegroups.com.
Visit this group at http://groups.google.com/group/django-developers.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-developers/5569EAC9.4040503%40kth.se.
For more options, visit https://groups.google.com/d/optout.