将 Django 与 Ajax 库集成的“最佳”方式

Posted

技术标签:

【中文标题】将 Django 与 Ajax 库集成的“最佳”方式【英文标题】:"Best" way to integrate Django with an Ajax library 【发布时间】:2011-09-12 13:46:07 【问题描述】:

显然,课程很重要,但是有什么好的方法可以将 javascript 库与一个人的 Django 应用程序集成?

我打算使用 jQuery,主要是因为它看起来很流行而且看起来很强大(但我愿意接受其他建议)。

是否有非常有用或必不可少的 python 端库?还是最好简单地创建 JSON 视图,然后手动编写 javascript(使用适当的 javascript 框架)?

我(简要地)看过 Dajax,但根据很少的文档,尚不清楚它是否真的给了我很多。我当然更喜欢有更多文档的东西。

此处的其他答案表明 pjax 不一定适用于许多浏览器,因此已经过时了。

编辑:谢谢大家。我将研究美味派以简化公开一些 json 视图,并手动编写一些 javascript(今年早些时候已经做了一点点,似乎比 90 年代后期要好得多)。

【问题讨论】:

对于任何有兴趣的人,我的第一次和美味派一起出游:***.com/questions/6317764/… 【参考方案1】:

记住,仅仅因为它是 ajax 并不意味着你需要返回一个 json 转储。你确实可以返回一个渲染的模板。

确实,“正确的方法”是在 javascript 中构建所有标签,并用 json 数据填充该数据,但让我们面对现实吧,这真是让人头疼……如此之多以至于他们正在开发一种 jquery 模板语言。

您也不能只转储查询集。您需要手动构建 json 数据。所有这些教程和建议似乎都掩盖了这一事实。来自 django 文档:

def convert_context_to_json(self, context):
        "Convert the context dictionary into a JSON object"
        # Note: This is *EXTREMELY* naive; in reality, you'll need
        # to do much more complex handling to ensure that arbitrary
        # objects -- such as Django model instances or querysets
        # -- can be serialized as JSON.
        return json.dumps(context)

我所做的实际上是为新的基于类的视图编写一个 mixin,根据它是否是 ajax 页面加载来呈现模板选择。然后,我将想要返回的片段放入一个片段中,并在另一个包装模板中,扩展 base.html 并包含片段模板。

class AjaxTemplateMixin(TemplateResponseMixin):
    ajax_template_name = None

    def get_template_names(self):
        if self.ajax_template_name and self.request.is_ajax():
            self.template_name = self.ajax_template_name

        return super(AjaxTemplateMixin, self).get_template_names()    

这允许我只编写一次模板,然后无需在 javascript 中手动构造 dom 元素。这几乎不需要额外的工作,尤其是如果您不编写 api,这是可行的方法。

【讨论】:

我喜欢您提出的非常重要的观点,尽管在某些情况下将模板和数据分别发送给客户端可能会更好,例如。如果您希望您的应用也能轻松离线工作。【参考方案2】:

我建议您简单地创建自己的 javascript 和 AJAX 视图。 Ruby on Rails 长期以来一直存在相反的问题:强迫人们以某种​​方式执行 AJAX,而这总是是人们的冲突点。最近,他们终于意识到了自己的愚蠢,并将 AJAX 从框架中解耦,这样您就可以轻松地使用您喜欢的任何库。

这是 Django 的一个特性。这可能看起来更困难,但相信我,端到端控制最终会变得更好。

【讨论】:

【参考方案3】:

在 python 方面,我建议查看 pistontastypie

(我自己从 AJAX + Django 开始,我也找到了 Dajax,但选择了 piston——对我来说感觉更“unix-way”,不喜欢这些多合一的解决方案。虽然活塞不是更新了好久,推荐tastypie,积极维护。)

编辑。还有一个类似的项目,django-rest-framework。自己还没用过,很新。

基本上,这些库可以帮助您为模型创建一个完全正常工作的读写 API,因此您可以通过 HTTP 从您的 javascript 执行 create-read-update-delete 操作。您不需要定义任何视图或序列化程序。相反,您定义了 resources,我认为这是一个不错的抽象。

而且通常只需要几行代码,尤其是当您的资源与模型绑定时。

但是,如果您需要更复杂的东西,您可以重新思考您的设计写下您的观点。使用基于类的视图,这也很容易。以this snippet 为例。

【讨论】:

可能值得注意的是,此时 django-rest-framework 是事实上的标准 @Marcin,Django 本身也得到了改进:现在有 JsonResponse,您可以将其与您自己的序列化程序类一起使用。我现在实际上正在开发一个带有 React.js 客户端和 Django 服务器端的应用程序,选择使用纯 Django 并且到目前为止运行良好。该应用程序相对简单,现在有 4 个 API 端点,我认为最终不会超过十几个。【参考方案4】:

我总是创建自己的视图来提供 JSON,并自己编写 JavaScript(通常使用 jQuery)。显然,这一切都取决于您想要做什么 - 如果您有特定需求而现有应用程序可以解决,那么请务必使用它。

提供 JSON 非常简单(只需转储一些 JSON 并将其作为 HttpResponse 返回),如下所示:

def get_user_ids(request):
    if not request.is_ajax():
        raise Http404

    return HttpResponse(simplejson.dumps('ids': [u.pk for User.objects.all()]))

上面的代码是为了演示,我不建议你创建一个显示所有用户 ID 的视图。

【讨论】:

【参考方案5】:

Dajax 非常简单。你最好告诉我们更多关于你在 Dajax 中的困惑。

【讨论】:

文档甚至没有真正告诉我它的作用。我通常非常热衷于被告知它的作用,而不仅仅是“它使 ajax 变得简单”。 @Marcin 首先,dajax 有两个产品。一种称为 dajaxice,另一种称为 dajax。 dajax 允许您编写 python 代码以用作 javascript。我不喜欢这种解决方案,因为它无法将视图与表示层分开。我更喜欢 dajaxice,因为在这个解决方案中,javascript 是 javascript,python 是 python。我推荐达贾克斯。综上所述,您可以阅读 dajaxice 文档here。如果您对本文档有任何具体疑问,请告诉我。

以上是关于将 Django 与 Ajax 库集成的“最佳”方式的主要内容,如果未能解决你的问题,请参考以下文章

Django - 发出 Ajax 请求

无法将 jquery/ajax 集成到 django 项目中

django基础知识之Ajax:

django之jquery完成ajax

在Django中测试django-rq(python-rq)的最佳实践

django之使用jquery完成ajax