javascript - 使用 Django 和 Backbone 进行渐进增强 - 如何将两者集成?

标签 javascript python django backbone.js progressive-enhancement

我有一个非常简单的 Django 应用程序,它允许用户提交表单并查看根据国家/地区、持续时间和价格过滤的假期列表。

我想在前端使用 Backbone,这样启用 JS 的用户不需要 GET 就可以看到结果,而是可以动态加载。

我想使用 progressive enhancement ,让有 JS 的用户获得 Backbone 体验,没有 JS 的用户仍然可以使用表单。我也想关注DRY principle .

我的问题是如何最好地做到这一点。是否有将两者一起使用且重复次数最少的示例?我特别想到:

  1. 路由/italy/1-week/from-500-to-1000/这样的URL - 我现在需要写两套路由代码,一套在 Django 的 urls.py 和 Backbone 的路由器中,获取国家/持续时间/价格参数?
  2. 过滤 数据,基于参数 - 我是否需要编写两种不同的方法来执行此操作,一种在 views.py 中,一种在 Backbone 中? (我假设我至少可以为这两个调用使用一个 API。)
  3. 在模板中呈现 - 我是否需要为 Django 编写一个列表模板而为 Backbone 编写另一个列表模板,还是两者都可以使用相同的模板?

到目前为止,我发现将 Backbone 集成到 Django 中的最佳(唯一)示例是 Josh Bohde 的 Django Backbone repo , 这不是逐步增强的。

我也找到了这个 blog post on progressive enhancement with Backbone and Rails ,但是看到 Django 的类似内容真的很有用。

更新:刚刚找到 this SO question on a similar topic - 情况真的像答案听起来那么绝望吗?

最佳答案

is the situation really as hopeless as the answer makes it sound?

差不多。但是,由于我在一个曾经基于 Django 但现在正在变成基于 Backbone 的网站上工作,我可以提供一些想法:

Routing a URL like /italy/1-week/from-500-to-1000/ - do I now need to write two sets of routing code, one in Django's urls.py and one in Backbone's router, to get the country/duration/price parameters?

是的,但是有一些方法可以最大程度地减少重复。我们采取的方法是让 Django 将所有 URL 作为 JS 变量输出到我们的主要 HTML 页面模板中:

<script>
URLS.report_error = "{% url app.log_client_error_view %}";
URLS.access_file = "{% url app.access_file_view 12345 %}";
</script>

现在我们有一个模式,在我们生成的每个 URL 中使用 12345 作为参数;这使得将该 URL 转换回主干路由正则表达式变得容易,因为我们基本上可以将 12345 替换为 ([^/]+)

为了全面披露,我们确实有一堆“手工”编写的路由正则表达式,但这并不是因为我们无法将它们自动化;只是我们正在远离 Django 方面的事情,所以我们没有理由清理这些代码。如果您想坚定地支持这两者,您应该能够想出一个非常容易/简单的翻译方案。

Filtering the data, based on the parameters - do I need to write two separate ways of doing this, one in views.py and one in Backbone? (I assume I can at least use a single API for both calls.)

这在任何网站上基本上都是无法避免的问题,不仅仅是Backbone/Django。您必须在服务器端过滤数据,因为您永远无法信任客户端(例如,用户可能会禁用 JS)。同时,仅服务器端过滤是 1990 年代的事情,因此您还需要在客户端创建(重复)过滤逻辑(这样您就可以告诉用户“您忘记提供字段 X”而无需等待用于到服务器的往返)。

但是,有一些方法可以限制这种重复。我自己并没有从事这方面的工作,但我知道一位同事设法以一种奇怪的方式使用 Django 表单(他采用了 Django 提供的表单,然后在将它们用作 Backbone View 的模板之前稍微解析它们)。这并没有完全消除重复,不幸的是我不记得任何细节,但它确实有帮助。

Rendering in templates - do I need to write one list template for Django and another for Backbone, or can both use the same templates?

如果您所做的只是变量 ({{foo}}),Handlebars 模板的语法与 Django 模板类似。如果你想在两者之间共享逻辑,两者的语法略有不同({% if foo %} vs. {{#if foo}}),但它们是足够接近,如果您不介意做一些解析工作,您应该可以轻松地将一个转换为另一个。

是的,您需要做很多工作来支持您的一小部分用户(那些使用不支持 Backbone 的浏览器的用户)。我强烈建议您在诸如 Google Analytics(分析)之类的地方查看用户的浏览器统计信息(或者如果您的网站尚未启动,则查看一般网络统计信息),以确定所有这些麻烦是否真的值得您的用户群的一小部分。没有统计数据,您无法知道该百分比有多小,而这显然是该决定的关键因素。

对我们来说,选择是显而易见的:要求我们的用户使用本世纪制造的浏览器(这几乎是 Backbone 的所有需求)并且只使用所有 Backbone。但是如果这个选择对你来说不是那么明显......祝你好运尝试 DRY up 你的 Django 和 Backbone 代码:-)

关于javascript - 使用 Django 和 Backbone 进行渐进增强 - 如何将两者集成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14156525/

相关文章:

python - Pandas :一个系列的真值是模棱两可的

python - django session 以防止用户多次投票

python - 在 django 1.7.6 上运行 django-oscar 的 Heroku 上从 Python 2.7 切换到 Python 3.4 时出现导入错误

javascript - 原型(prototype)继承中的 call() 需要什么

javascript - 控制 javascript 异步流的速率(在循环中)

javascript - 错误: Could not resolve 'api.movieDetails' from state 'api'

python - 使用 matplotlib 将文本添加为​​星号

python - mincemeatpy 和 octopy 的替代品

python - Django 表单,未提交表单

javascript - python Selenium : Clicking on button with JavaScript onFocus validation