Django 应用程序中的 Ajax 架构

Posted

技术标签:

【中文标题】Django 应用程序中的 Ajax 架构【英文标题】:Ajax architecture in Django application 【发布时间】:2010-12-22 09:59:08 【问题描述】:

我正在尝试为我目前正在构建的一个重 ajax 的 Django 应用程序找到最佳架构。我想保持一致的方式来处理表单、验证、获取数据、JSON 消息格式,但发现很难找到可以一致使用的解决方案。

有人能指出正确的方向或分享他们对最佳实践的看法吗?

【问题讨论】:

Ajax 有什么特别之处?从 django 的角度来看,这些只是请求。 没什么,但我发现自己讨厌例如混合使用正常请求/响应周期的内容模板渲染和来自 ajax 请求的内容。感觉不干净。 【参考方案1】:

我将所有内容都设置为在浏览器中正常显示的正常视图。这包括对 AJAX 请求的所有回复(子页面)。

当我想让网站的某些部分更加动态时,我会使用 jQuery 来执行 AJAX,或者在本例中是 AJAH,然后将子页面中的一个 div 的内容加载到请求页面中。

这种技术非常有效 - 调试子页面非常容易,因为它们只是普通页面,而 jQuery 使您的生活变得非常轻松,将它们用作 AJA[XH]ed 页面的一部分。

【讨论】:

好吧,听起来很合理。但是您是为 AJAX 请求和普通请求创建单独的视图函数,还是使用 if_ajax() 返回不同的响应?表单呢,你是使用普通请求提交表单数据还是使用AJAX? 我首先创建了一个在浏览器中工作的视图,然后使用 jQuery 从其中抓取相关位并将其插入到请求页面中。我还没有使用is_ajax。至于表单,我确实将 jQuery 表单提交用于动态页面。这些 POST 到一个普通的 django 视图。 我是ajax/django新手,但是你的方法是不是效率很低?这意味着返回比您实际需要的多得多的内容(所有周围的 html,而不是实际数据)。还是我错过了什么? 它返回的数据确实比绝对必要的多。但是我认为你很难衡量它与构建 json/xml 并返回它之间的速度差异。编写和调试当然要容易得多。如果您的程序员时间比您的带宽更稀缺,那么 AJAH 每次都胜过 AJAX!【参考方案2】:

对于这个问题的所有答案,我不敢相信还没有人提到django-piston。它主要被推广用于构建 REST API,但它可以输出 JSON(其中 jQuery 可以使用)并且就像视图一样工作,您可以对请求执行任何操作,使其成为实现 AJAX 交互的绝佳选择(或 AJAJ [JSON]、AJAH 等)。它还支持form validation。

【讨论】:

【参考方案3】:

我想不出任何将 ajax 插入 Django 应用程序的标准方法,但你可以看看这个tutorial。

您还可以在django's page about Ajax上找到更多详细信息

【讨论】:

【参考方案4】:

两周前,我做了一个write up 如何实现子模板以在“正常”和“ajax”请求中使用它们(对于 Django,它是相同的)。也许对你有帮助。

【讨论】:

【参考方案5】:

+1 给 Nick 以使页面在浏览器中正常显示。这似乎是最好的起点。

最简单的 AJAX 方法(例如 Nick 和 vikingosegundo 提出的)的问题在于,您必须依赖 javascript 中的 innerHTML 属性。这是转储 JSON 中发送的新 HTML 的唯一方法。有些人会认为这是一件坏事。

不幸的是,我不知道使用与 Django 渲染匹配的 Javascript 来复制表单显示的标准方法。我的方法(我仍在研究)是对 Django Form 类进行子类化,以便它输出一些 Javascript 以及来自 as_p() 等的 HTML。然后这些复制我操作 DOM 的表单。

【讨论】:

【参考方案6】:

根据我的经验,我知道管理在服务器端生成 HTML 并将其“插入”到页面中的应用程序会变成一场噩梦。使用 Django 测试框架进行测试也是不可能的。如果您使用 Selenium 或类似工具,没关系,但您需要等待 ajax 请求返回,因此您需要在测试脚本中进行大量休眠,这可能会减慢您的测试套件。

如果使用 Ajax 技术的目的是创建一个良好的用户界面,我会建议全力以赴,就像 GMail 界面一样,并在浏览器中使用 JavaScript 完成所有操作。我已经编写了几个这样的应用程序,只使用 jQuery、用于管理 UI 状态的状态机和在后端使用 ReST 的 JSON。在这种情况下,Django,恕我直言,是后端的完美搭配。甚至还有第三方软件可以为您的模型生成 ReST 接口,我自己从未使用过,但据我所知,它们擅长简单的事情,但您当然仍然需要做自己的业务逻辑.

使用这种方法,您确实会遇到在 JS 和后端中重复代码的问题,例如表单处理、验证等。我一直在考虑通过生成有关表单和验证逻辑的结构化信息来解决这个问题我可以在 JS 中使用。这可以在部署时编译并作为任何其他 JS 文件加载。

另外,避免使用 XML。浏览器解析它的速度很慢,生成起来很痛苦,在浏览器中使用也很痛苦。使用 JSON。

【讨论】:

【参考方案7】:

我正在测试:

jQuery 和backbone.js 客户端

django-piston(中间层)

稍后将我的发现写在我的博客http://blog.sserrano.com

【讨论】:

以上是关于Django 应用程序中的 Ajax 架构的主要内容,如果未能解决你的问题,请参考以下文章

Django中的文件上传+Ajax详细应用

如何在 Django 中的 Ajax 成功后显示 Html Div

在 Django 中的 AJAX POST 请求后重新加载模板

使用 jquery、ajax 和 django 定期刷新页面

前端 ajax POST 调用无法登录 Django

Python-Django-BBS