我有一个非常简单的Django应用程序,它允许用户根据国家,持续时间和价格提交表单并查看过滤的假期列表。
我想在前端使用Backbone,因此启用了JS的用户不需要GET来查看结果,但可以动态加载它们。
我想使用progressive enhancement,以便拥有JS的用户获得Backbone体验,而没有JS的用户仍然可以使用该表单。我也想关注DRY principle。
我的问题是如何做到最好。是否有将两者一起使用且重复次数最少的例子?我特别在想:
/italy/1-week/from-500-to-1000/
这样的网址 - 我现在需要编写两组路由代码,一个在Django的urls.py
中,一个在Backbone的路由器中,以获取国家/地区/期限/价格参数?views.py
中,另一种在Backbone中? (我假设我至少可以为这两个电话使用一个API。)迄今为止我发现将Backbone整合到Django中的最好(唯一)示例是Josh Bohde的Django Backbone repo,它没有逐步增强。
我也发现了这个blog post on progressive enhancement with Backbone and Rails,但看到类似于Django的东西真的很有用。
更新:刚刚找到this SO question on a similar topic - 这种情况真的无望,因为答案听起来不错吗?
答案 0 :(得分: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)。同时,仅服务器端过滤是sooo 1990,所以你需要创建(复制)逻辑以在客户端进行过滤(这样你就可以告诉用户“你忘了提供字段X”而无需等待对于服务器的往返)。
但是,有一些方法可以限制这种重复。我自己并没有在这篇文章上工作,但我知道一个同事设法以奇怪的方式使用Django表单(他采用了Django提供的形式,然后稍微解析它们,然后将它们用作Backbone View的模板)。这并没有完全消除重复,不幸的是我不记得任何细节,但确实有所帮助。
在模板中渲染 - 我是否需要为Django编写一个列表模板,为Backbone编写另一个列表模板,还是可以使用相同的模板?
如果您所做的只是变量({{foo}}
),则Handlebars模板具有与Django模板类似的语法。如果你想在两者之间共享逻辑,两者的语法略有不同({% if foo %}
与{{#if foo}}
),但它们足够接近,如果你不介意做一点解析工作,你应该很容易能够将一个转换为另一个。
所以是的,你正在接受很多工作只是为了支持你的一小部分用户(那些使用不支持Backbone的浏览器)。我强烈建议您在某些地方查看用户的浏览器统计信息(如果您的网站尚未启动,请查看常规网络统计信息),以确定是否真的值得这样做您的一小部分用户群。如果没有统计数据,您无法知道该百分比有多小,显然是该决定的关键因素。
对于我们来说,选择是显而易见的:要求我们的用户使用本世纪开发的浏览器(这几乎都是Backbone需要的)并且只需要使用所有Backbone。但是,如果这个选择对你来说不那么明显...祝你好好干掉你的Django和Backbone代码: - )
答案 1 :(得分:1)
我刚刚读到了一个完全不同的解决方案,我认为我会分享这个问题:HTML快照(https://developers.google.com/webmasters/ajax-crawling/docs/html-snapshot)。我链接的页面是基于Java的,但你可以在Python / Django中设置类似的东西。
基本思想是在服务器上设置无头Javascript运行器,当网络爬虫到达您的网站时,您使用该JS运行器生成Backbone代码在客户端正常运行时生成的HTML 。然后它将该HTML发送回Web爬虫,让您拥有一组客户端和服务器代码。
运行无头JS转轮可能存在一些小的潜在问题(它们与网络浏览器的内置JS不完全相同)但是当用于这种“HTML快照”方法时,它们应该不太相关
答案 2 :(得分:0)
不确定你是否还在努力解决这个问题,但我一直在努力寻找解决这个问题的方法。我写了一篇关于它的初步博客文章:
JavaScript frameworks interoperability with Django
我将在几周后跟进一个完整的“Notes”应用程序示例,使用Django + Backbone + Marionette +其他一些插件完成。
代码将演示如何在客户端使用Django模板,因此它可能对您有用。
如果有兴趣,您可以关注我的博客或推特(更好)@sid_azad