我有一个非常简单的Django应用程序,它允许用户提交表单,并根据国家、持续时间和价格查看筛选的假期列表。在
我希望在前端使用主干网,这样启用了JS的用户不需要看到结果,而是可以动态地加载它们。在
我想使用progressive enhancement,这样有JS的用户就可以获得主干网的体验,没有JS的用户仍然可以使用表单。我还想遵循DRY principle。在
我的问题是如何最好地做到这一点。有没有用最少的重复性将两者结合使用的例子?我特别想到:
/italy/1-week/from-500-to-1000/
-我现在需要编写两组路由代码吗,一组在Django的urls.py
中,一组在主干的路由器中,以获得国家/时间/价格参数吗?在views.py
中,另一种是在主干网中?(我想我至少可以为两个调用使用一个API。)到目前为止,我发现的将主干网集成到Django中的最好(唯一)例子是joshbohde的Django Backbone repo,它没有逐步增强。在
我也发现了这个blog post on progressive enhancement with Backbone and Rails,但是看到Django类似的东西会非常有用。在
更新:刚刚发现this SO question on a similar topic-情况真的和答案听起来一样没有希望吗?在
我刚读到一个完全不同的解决方案,我想我会分享这个问题:HTML快照(https://developers.google.com/webmasters/ajax-crawling/docs/html-snapshot). 我链接的页面是基于Java的,但是您当然可以在Python/Django中设置类似的内容。在
基本思想是在服务器上设置一个无头Javascript运行程序,当一个web爬虫程序访问您的站点时,您可以使用该JS运行程序生成如果在客户端正常运行的话,您的主干代码将生成的HTML。然后,它将该HTML发送回web爬虫程序,让您拥有一组客户端和服务器的代码。在
运行无头JS运行程序可能会有一些小的潜在问题(它们与web浏览器的内置JS不是100%相同),但当用于这种“HTML快照”方法时,它们不应该太相关。在
不知道你是否还在努力解决这个问题,但我一直在努力寻找解决这个问题的办法。我在上面写了一篇初步的博文:
JavaScript frameworks interoperability with Django
我将在几周后用Django+主干网+木偶+一些其他插件完成的“Notes”应用的完整示例。在
代码还将演示如何在客户端使用Django模板,因此它可能对您有用。在
如果你感兴趣,你可以关注我的博客或推特(更好)@sid zu azad
差不多。但是,由于我在一个以前是基于Django的网站上工作,但现在正变得基于主干网,所以我可以提供一些想法:
是的,但有办法尽量减少重复。我们采用的方法是让Django将所有url作为JS变量输出到我们的主HTML页面模板上:
现在我们有了一个模式,在我们生成的每个URL中使用12345作为参数;这使得将该URL转换回主干路由regex变得很容易,因为我们基本上可以将
12345
替换为([^/]+)
。在为了全面披露,我们确实有一堆路由regex是“手工”编写的,但这并不是因为我们不能自动化它们;只是我们正在远离Django方面的东西,所以我们没有理由清理这些代码。如果你想在支持两者的问题上取得核心,你应该能够想出一个相当简单/简单的翻译方案。在
这在任何站点上都是一个基本上不可避免的问题,不仅仅是主干网/Django。您可以在服务器端过滤数据,因为您永远不信任客户端(例如,用户可以禁用JS)。同时,服务器端的过滤是sooo 1990年代的,所以你需要在客户端创建(复制)过滤逻辑(这样你就可以告诉用户“你忘了提供字段X”,而不用等待服务器的往返)。在
但是,有一些方法可以限制这种重复。我自己并没有写这篇文章,但我知道一个同事以一种奇怪的方式使用Django表单(他采用Django提供的表单,然后在将其用作主干视图的模板之前对其稍加解析)。这并没有完全消除重复,不幸的是,我不记得任何细节,但它确实有帮助。在
如果您所做的只是变量(
{{foo}}
),那么手柄模板的语法与Django模板类似。如果您想在两者之间共享逻辑,这两种语言的语法略有不同({% if foo %}
vs.{{#if foo}}
),但是它们非常接近,如果您不介意做一些解析工作,您应该可以很容易地将一个转换为另一个。在所以,是的,你需要做大量的工作来支持你的一小部分用户(那些浏览器不能支持主干网)。我强烈建议你在Google Analytics之类的网站上查看用户的浏览器统计数据(如果你的网站还没有建立起来的话,也可以查看一般的web统计数据),以确定对于你的一小部分用户来说,所有这些麻烦是否真的值得。如果没有统计数据,你就不可能知道这个百分比有多小,很明显这是决定的一个关键因素。在
对我们来说,选择是显而易见的:要求我们的用户使用本世纪制造的浏览器(这几乎是所有主干网的需要),而只需使用所有主干网。但如果这个选择对你来说不那么明显。。。祝你好运,试着干掉你的Django和主干代码:-)
相关问题 更多 >
编程相关推荐