随着Django和骨干的逐步增强,如何将两者结合起来?

2024-06-16 10:46:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我希望在前端使用主干网,这样启用了JS的用户不需要看到结果,而是可以动态地加载它们。在

我想使用progressive enhancement,这样有JS的用户就可以获得主干网的体验,没有JS的用户仍然可以使用表单。我还想遵循DRY principle。在

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

  1. 路由/italy/1-week/from-500-to-1000/-我现在需要编写两组路由代码吗,一组在Django的urls.py中,一组在主干的路由器中,以获得国家/时间/价格参数吗?在
  2. 过滤基于参数的数据-我是否需要编写两种不同的方法来完成此操作,一种是在views.py中,另一种是在主干网中?(我想我至少可以为两个调用使用一个API。)
  3. 在模板中呈现我需要为Django编写一个列表模板,为主干编写另一个列表模板,还是两者都可以使用相同的模板?在

到目前为止,我发现的将主干网集成到Django中的最好(唯一)例子是joshbohde的Django Backbone repo,它没有逐步增强。在

我也发现了这个blog post on progressive enhancement with Backbone and Rails,但是看到Django类似的东西会非常有用。在

更新:刚刚发现this SO question on a similar topic-情况真的和答案听起来一样没有希望吗?在


Tags: django用户py模板表单路由列表参数
3条回答

我刚读到一个完全不同的解决方案,我想我会分享这个问题: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

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

差不多。但是,由于我在一个以前是基于Django的网站上工作,但现在正变得基于主干网,所以我可以提供一些想法:

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转换回主干路由regex变得很容易,因为我们基本上可以将12345替换为([^/]+)。在

为了全面披露,我们确实有一堆路由regex是“手工”编写的,但这并不是因为我们不能自动化它们;只是我们正在远离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.)

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

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

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}}),那么手柄模板的语法与Django模板类似。如果您想在两者之间共享逻辑,这两种语言的语法略有不同({% if foo %}vs.{{#if foo}}),但是它们非常接近,如果您不介意做一些解析工作,您应该可以很容易地将一个转换为另一个。在

所以,是的,你需要做大量的工作来支持你的一小部分用户(那些浏览器不能支持主干网)。我强烈建议你在Google Analytics之类的网站上查看用户的浏览器统计数据(如果你的网站还没有建立起来的话,也可以查看一般的web统计数据),以确定对于你的一小部分用户来说,所有这些麻烦是否真的值得。如果没有统计数据,你就不可能知道这个百分比有多小,很明显这是决定的一个关键因素。在

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

相关问题 更多 >