7

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

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

我想用渐进增强,让有JS的用户得到Backbone的体验,没有JS的用户仍然可以使用表单。我也想遵循DRY 原则

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

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

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

我还发现了这篇关于 Backbone 和 Rails 渐进式增强的博客文章,但是看到 Django 的类似内容会非常有用。

更新:刚刚在一个类似的主题上发现了这个 SO 问题——情况真的像答案听起来那样无望吗?

4

3 回答 3

3

情况真的像答案听起来那样无望吗?

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

路由像 /italy/1-week/from-500-to-1000/ 这样的 URL - 我现在需要编写两组路由代码,一组在 Django 的 urls.py 中,另一组在 Backbone 的路由器中,以获取国家/持续时间/价格参数?

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

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

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

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

根据参数过滤数据 - 我是否需要编写两种不同的方法,一种在 views.py 中,另一种在 Backbone 中?(我假设我至少可以为这两个调用使用一个 API。)

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

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

在模板中渲染 - 我需要为 Django 编写一个列表模板,为 Backbone 编写另一个列表模板,还是两者都可以使用相同的模板?

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

所以,是的,你做了大量的工作只是为了支持你的一小部分用户(那些浏览器不支持 Backbone 的用户)。我强烈建议您在 Google Analytics 之类的地方查看用户的浏览器统计信息(或者如果您的网站尚未启动,请查看一般网络统计信息),以确定对于您的一小部分用户群而言,所有这些麻烦是否真的值得. 如果没有统计数据,您将无法知道该百分比有多小,并且显然是该决定的关键因素。

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

于 2013-01-04T19:39:19.963 回答
1

我刚刚读到了一个完全不同的解决方案,我认为我会分享:HTML 快照 (https://developers.google.com/webmasters/ajax-crawling/docs/html-snapshot)。我链接的页面是基于 Java 的,但您当然可以在 Python/Django 中设置类似的内容。

基本思想是,您在服务器上设置一个无头 Javascript 运行程序,当网络爬虫访问您的站点时,您使用该 JS 运行程序生成如果您的 Backbone 代码在客户端正常运行时会生成的 HTML。然后,它将 HTML 发送回网络爬虫,让您拥有一组用于客户端和服务器的代码。

运行无头 JS 运行器可能存在一些潜在的小问题(它们与 Web 浏览器的内置 JS 不是 100% 相同),但是当用于这种“HTML 快照”方法时,它们不应该太相关。

于 2013-01-06T17:09:43.053 回答
0

不确定您是否仍在努力解决此问题,但我一直在努力寻找解决此问题的方法。我写了一篇关于它的初步博客文章:

JavaScript 框架与 Django 的互操作性

我将在几周内跟进一个完整的“Notes”应用程序示例,该应用程序使用 Django + Backbone + Marionette + Some Other Plugins 完成。

该代码还将演示如何在客户端使用 Django 模板,因此它可能对您有用。

如果有兴趣,您可以关注我的博客或推特(更好)@sid_azad

于 2013-06-05T16:02:54.660 回答