如何整合这两个?

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

我想在前端使用Backbone,以便启用了JS的用户不需要GET即可查看结果,但可以动态加载它们。

我想使用渐进式增强功能,以便JS用户获得Backbone体验,而没有JS的用户仍然可以使用该表单。 我也想遵循DRY原则。

我的问题是如何最好地做到这一点。 有没有使用这两者一起使用最少重复的例子? 我特别想到:

  • 路由一个类似于/italy/1-week/from-500-to-1000/的URL?我现在需要编写两套路由代码,一个在Django的urls.py ,另一个在Backbone的路由器中,以获取国家/持续时间/价格参数?
  • 根据参数过滤数据 - 我是否需要编写两种不同的方式来执行此操作,一个是在views.py ,另一个是在Backbone中? (我假设我至少可以为这两个调用使用一个API。)
  • 在模板中渲染 - 是否需要为Django和Backbone编写一个列表模板,或者都可以使用相同的模板?
  • 迄今为止,我发现的将Backbone集成到Django中的最好的(唯一的)例子是Josh Bohde的Django Backbone repo,它不是逐步增强的。

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

    更新:刚刚发现这个问题的类似话题 - 情况真的如绝望的答案听起来?


    这种情况真的是毫无希望,因为答案听起来很正确吗?

    非常好。 但是,由于我在一个曾经是基于Django的网站上工作,但现在正在成为基于骨干的网站,我可以提供一些想法:

    路由一个类似于/ italy / 1周/从500到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)。 同时,仅服务器端筛选是20世纪90年代的,因此您需要创建(重复)逻辑以在客户端进行筛选(这样,您可以告诉用户“您忘记提供字段X”而无需等待为了往返服务器)。

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

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

    如果您所做的只是变量( {{foo}} ),则Handlebars模板与Django模板的语法类似。 如果你想分享逻辑,两者的语法略有不同( {% if foo %} vs. {{#if foo}} ),但它们足够接近,如果你不介意做一些解析工作你应该很容易将其中一个转换成另一个。

    所以是的,你正在做很多工作来支持你的用户的一小部分(那些浏览器不支持Backbone的用户)。 我强烈建议您在Google Analytics等某个位置查看用户的浏览器统计信息(如果您的网站尚未启动,请查看常规网站统计信息),以确定是否所有这些问题对于您的用户群中的一小部分来说确实是值得的。 没有统计数据,你无法知道这个百分比是多少,而且显然是决定的关键因素。

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


    我刚刚阅读了关于这个问题的完全不同的解决方案,我想我会分享:HTML快照(https://developers.google.com/webmasters/ajax-crawling/docs/html-snapshot)。 我链接的页面是基于Java的,但你当然可以在Python / Django中设置类似的东西。

    基本思想是你在你的服务器上设置了一个无头Javascript运行器,当一个web爬行器击中你的站点时,你使用该JS运行器来生成你的Backbone代码在客户端正常运行时生成的HTML。 然后将该HTML发送回网络爬虫程序,让您为客户端和服务器都提供一组代码。

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


    不知道你是否仍在努力解决这个问题,但我一直在努力寻找解决这个问题的办法。 我写了一篇关于它的初步博客文章:

    JavaScript框架与Django的互操作性

    我将在几周后跟进一个完整的使用Django + Backbone + Marionette +一些其他插件完成的“Notes”应用程序的示例。

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

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

    链接地址: http://www.djcxy.com/p/68173.html

    上一篇: how to integrate the two?

    下一篇: Is it possible to export to CSV and have the header contain spaces?