33

介绍

我目前正在编写一个非常标准的基于 Django 的应用程序(基本上是一种花哨的 CRM/联系人列表之类的东西)。它有点工作,但随着我不断尝试使用越来越多的 AJAXy UI 代码(使用 jQuery)来改进界面,使用它开始变得非常痛苦。我得到了很长的脆弱 jQuery 事件处理程序块,它们解析 DOM,将更改推送回服务器,获取一些 JSON,并尝试基于此更新 DOM。

我觉得,至少,我可能想在组合中添加一些客户端模板。或者,我可以尝试切换到 JS 框架,并将我的 Django 应用程序用作数据库抽象层。或者即使我了解并喜欢 Python,我也可以放弃 Django 应用程序,并尝试使用 JS/Node.js 解决方案或其他方式。

有没有其他人遇到过这种情况?你是怎么解决的?

设计目标

  1. DRY:我不想复制我的模型或模板(或者至少,不需要复制)。
  2. 我希望访问者登陆页面以获得服务器端渲染的结果。
  3. 当访问者单击事物时,我想通过客户端模板和呈现来处理它,并通过 AJAX 调用对 REST 接口保持服务器更新。

那么......我该怎么做呢?我收集了一些框架和模板系统的链接。没有特别的顺序:

灰尘.js

LinkedIn显然正在使用它来解决类似的问题。它在服务器端使用 Node.js,这并不理想(我从未使用过 Node),但至少它不是基于 JVM。它在 github 上似乎也处于休眠状态 - 我发现人们一直想知道维护者去了哪里的邮件列表。听起来确实不错——LinkedIn 的博客文章很好地推销了这项技术,尤其是编译它的能力。但它似乎只是模板。这足以满足我的要求吗?

小胡子

此选项同时具有 Python 和 JS 实现,并且似乎很受欢迎……但我找不到任何似乎在 Django 中使用 Mustache 模板的人。这是因为它太容易配得上一篇博文,还是不可能或不明智?它也非常有限。至少我可能需要求助于某种 MVC JS 框架,对吧?

Backbone、Spine、KnockoutJS、EmberJS、JavascriptMVC 等:

有这么框架,有点令人生畏。乍一看,所有这些似乎都非常好。如果我走这条路,我似乎还需要重写很多我的应用程序,而且我真的很想找到一个实际上已经做过类似事情的人。另外,如果有一个明确的选择让来自 Django 的人作为背景,那就太好了;我不想学习六种不同的框架来评估它们。

德比JS

这看起来很有趣,因为它在一个包中同时处理客户端和服务器端,但有点不成熟。他们警告不要在生产中使用它,如果我理解文档,它还不支持任何形式的持久性,这是......限制。我觉得如果它完成了,那将是我想要的完美……

所以....

所以,呃……现在呢?有没有人使用这些工具尝试将客户端渲染添加到 Django webapp?进展如何?

4

4 回答 4

6

对于与 Django 模板的完整集成,我发现了这个:Yz-Javascript-Django-Template-Compiler。我自己从未使用过它,不幸的是它看起来有点无人维护。

Swig是一个快速的 JS 类 django 模板引擎。

Pure是一个编译好的 JS 模板工具,经过一番思考,我认为它可以很好地与 Django 一起工作,因为模板只是普通的有效 HTML。

其他有趣的 JS 模板库:

于 2011-12-15T15:08:27.787 回答
4

所有提到的框架都只在客户端工作。一方面,它们值得一看,因为它们是您面临的难题的一部分。

您的设计目标正是我在当前项目中试图实现的目标。我目前正在尝试做的是:

客户端

使用 Backbone +(这里有一些模板引擎)

服务器端

呈现第一组 html,以及呈现 Backbone 可以获取和使用的一些 JSON 数据(例如,加载的当前页面、最大页面数等)

例子

客户端加载: http: //mysite.com/blog/archive/5

服务器呈现:

<html>
    <head>
        <script>
            var data = {
                page:5 // Rendered by Server,
                maxPages: 10
            };

            $(function(){
                // Hook up all Backbone stuff, and hook into interaction events
            });
        </script>
    </head>
    <body>
        <!-- Content -->
    </body>
</html>

这解决了设计要点 2 和 3:您的服务器加载 Web 应用程序的初始状态,用户可以从那里导航客户端。

设计要点 1:在客户端,一切都很好。但是,对于服务器端,您需要一个 js 引擎来呈现您的模板。LinkedIn 在他们的文章中提到了这一点:

  • 服务器端支持:如果您有一个无法执行 JavaScript 的客户端,例如搜索引擎爬虫,则必须在服务器端呈现页面。编写完成后,相同的dust.js 模板不仅可以在浏览器中渲染,还可以使用node.jsRhino在服务器上渲染。

所以你有两个选择:

  • 使用带有 node.js 或 Rhino 的模板引擎,或者
  • 在其他技术堆栈中找到支持的模板引擎。

有趣的是,多亏了上面的帖子,我意识到Mustache具有可用于大多数常见堆栈的库,完美地满足了这一需求,因此我将开始考虑将其与我的项目集成。(不确定是否有任何可用于 Handlebars.js 的库)这应该允许我们为服务器端和客户端编写 Mustache.js 模板,并让它们在两端使用相同的模板渲染 html。

编辑:不应该“服务器端”解决方案不一定需要在您选择的语言/堆栈中。例如,仅仅因为您使用 Dust.js 就意味着您必须在 Node.JS 中编写整个应用程序。可以通过 shell 命令执行编译脚本来获取。

编辑:事实证明 Mustache 似乎没有“预编译”解决方案,这意味着模板需要直接渲染到页面中以进行客户端渲染(因此没有缓存),这不是 100% 理想的。

于 2012-01-02T00:32:47.780 回答
2

我知道这是个老问题,但我不知何故来到了这里,所以其他人可能会这样做。

我还尝试找到构建 RIA 的解决方案,该解决方案将在尽可能多的设备上工作,响应迅速、性能好并且具有良好的用户体验。带有模板的后端 Django 正在实施,以便在需要时可以选择优雅地回退。

现在我正在浏览所有这些 js 框架,我有点担心,主要是关于性能和可访问性。

考虑到模板是在服务器上实现的,我倾向于使用在后端渲染的 html 片段进行部分 DOM 更新并发送到胖客户端而不是 json 的解决方案。看起来对我来说是最好的选择。

想法取自: http: //openmymind.net/2012/5/30/Client-Side-vs-Server-Side-Rendering/

问候,迈克

于 2014-02-18T10:31:30.740 回答
1

我在服务器端和客户端都使用过 Mustache,效果很好。我使用它的项目只是一个小项目,但我对结果非常满意并会推荐它。

该项目是一个用于调试 HTTP 服务的 Web 应用程序,如果您想查看的话,它位于 GitHub 上:Spyglass

于 2011-12-15T05:05:11.883 回答