AJAX and Django
problems
- browser history
- deep linking - every page needs URL
- crawler visibility -> SEO indexing
hash fragment - domain.com/#/foo/bar/
hash fragment - domain.com/#!/foo/bar/
- google replaces #! -> ?_escaped_fragment_= - ajax-crawling
-
- deep links load first page and then load deeper page
- multiple URLS for every page
-
- o have to use #! in your sitemap.xml
pushstate
- already done in back end, reuse URL in front end
- harder to implement on front end (browser support - but graceful degradation)
PJAX PushState Ajax
- fetch whole page source (or parts)
- extract specified div and update content and title
- push URL
used
- django - template inheritance and filters, middleware
- backbone.js - router ...
conditionally extend base.html or base_pjax.html (which is a json template)
backbone handles link clicks and form submits
pitfalls
- caching - json/html come from same URL -> confuse browser -> cache-control set vary: x-requested-with
- safari (and until recently chrome) ignore vary: header - workaround to put /_pjax/ at start of URL
- redirecting
- handled transparently wrt XMLHttpRequest - no chance to intercept
- middleware to catch redirect for ajax and return code
client side templates
- reuse server side templates if possible
- plate-js library can use django templates - but doesn’t have full context